不用深度学习,怎么提取图像特征?
来源 | 小白学视觉
头图 | 下载于ICphoto
图像分类是数据科学中最热门的领域之一,在本文中,我们将分享一些将图像转换为特征向量的技术,可以在每个分类模型中使用。
VATbox
VATbox,作为n一个我们所暗示的,涉及增值税问题(以及更多)的发票世界的问题之一是,我想知道有多少发票是一个形象?为了简化问题,我们将问一个二元问题,图像中是否有一张发票或同一图像中有多张发票?为什么不使用文本(例如TF-IDF)?为什么只使用图像像素作为输入?因此,有时我们没有可靠的OCR,有时OCR花费了我们金钱,我们不确定我们是否要使用它。.当然,对于本文来说,演示经典方法从图像中提取特征的力量。
import cv2gray_image = cv2.imread(image_path, 0)img = image.load_img(image_path, target_size=(self.IMG_SIZE, self.IMG_SIZE))
缩小图像
想象一下,你们正在密切注视着图像,可以看到附近的像素。因此,如果我们的图像包含文本,则可以看到单词之间和行之间的白色像素。如果我们的意图是(至少在这种情况下)决定图像中是否有一张发票,我们可以从一定距离看图像-这将有助于忽略图像中的“无聊”空白。
# scale parameter – the relative size of the reduced image after the reduction.image_width = int(gray_image.shape[1] * scale_percent)image_height = int(gray_image.shape[0] * scale_percent)dim = (width, height)gray_reduced_image = cv2.resize(gray_image, dim, interpolation=cv2.INTER_NEAREST)cv2.imshow('image', resized)cv2.waitKey(0)
图像的熵
我们可以这样考虑-每个图像的多个发票或单个发票之间的差异可以转换为图像中的信息量,因此,我们可以期望每个类别中的平均熵得分不同。
其中n是灰度级的总和(8位图像为256),p是像素具有灰度级i的概率。
from sklearn.metrics.cluster import entropyentropy1 = entropy(gray_image)entropy2 = entropy(gray_reduced_image)
数据库扫描
Dbscan算法具有在图像空间中查找密集区域并将其分配给一个群集的能力。它的最大优点是它可以自行确定数据中的类数。我们将从dbscan模型创建3个功能:
类的数量(这里的假设是,类的数量过多将表明图像中的发票数量众多)。
噪声像素的数量。
模型中的轮廓分数(轮廓分数衡量每个像素的分类程度,我们将取所有像素的平均轮廓分数)
from sklearn.cluster import DBSCANfrom sklearn import metricsthr, imgage = cv2.threshold(gray_reduced_image, 0, 255, cv2.THRESH_BINARY + cv2.THRESH_OTSU)img_df = pd.DataFrame(img).unstack().reset_index().rename(columns={'level_0': 'y', 'level_1': 'x'})img_df = img_df[img_df[0] == 0]X = image_df[['y', 'x']]db = DBSCAN(eps=1, min_samples=5).fit(X)# plt.scatter(image_df['y'], image_df['x'], c=db.labels_, s=3)# plt.show(block=False)core_samples_mask = np.zeros_like(db.labels_, dtype=bool)core_samples_mask[db.core_sample_indices_] = Truelabels = db.labels_# Number of clusters in labels, ignoring noise if present.n_clusters_ = len(set(labels)) - (1 if -1 in labels else 0)n_noise_ = list(labels).count(-1)image_df['class'] = labels# print('Estimated number of clusters: %d' % n_clusters_)# print('Estimated number of noise points: %d' % n_noise_)# print("Silhouette Coefficient: %0.3f" % metrics.silhouette_score(image_df, labels))features = pd.Series([n_clusters_, n_noise_, metrics.silhouette_score(image_df, labels)])
计算零点交叉
我们(灰度)图像中的每个像素的值都在0到255之间(在我们的示例中,零被视为白色,而255被视为黑色)。如果要计算“零”交叉,则需要对图像进行阈值处理—即设置一个值,以使较高的值将分类为255(黑色),而较低的值将分类为0(白色)。在我们的案例中,我使用了Otsu阈值。在执行图像阈值处理之后,我们将获得零和一作为像素,我们可以将其视为数据帧并将每一列和每一行相加:
现在,假设1代表文本区域(黑色像素),0代表空白区域(白色像素)。现在,我们可以计算每行/列总和从任何正数变为零的次数。
img = img / 255df = pd.DataFrame(img)pixels_sum_dim1 = (1 - img_df).sum()pixels_sum_dim2 = (1 - img_df).T.sum()zero_corssings1 = pixels_sum_dim1[pixels_sum_dim1 == 0].reset_index()['index'].rolling(2).apply(np.diff).dropna()zero_corssings1 = zero_corssings1[zero_corssings1 != 1]num_zero1 = zero_corssings1.shape[0]zero_corssings2 = pixels_sum_dim2[pixels_sum_dim2 == 0].reset_index()['index'].rolling(2).apply(np.diff).dropna()zero_corssings2 = zero_corssings2[zero_corssings2 != 1]num_zero2 = zero_corssings2.shape[0]features = pd.Series([num_zero1, num_zero2])
归一化图像直方图
如果我们将图像视为信号,则可以使用信号处理工具箱中的一些工具。我们将使用重新采样的想法来创建更多功能。
怎么做?首先,我们需要将图像从矩阵转换为一维向量。其次,由于每个图像都有不同的形状,因此我们需要为所有图像设置一个重采样大小-在本例中。
使用插值,我们可以将信号表示为一个连续函数,然后我们将对其进行重新采样,采样之间的间隔为
其中x表示图像信号,C表示要重采样的点数。
from scipy.signal import resampledim1_normalized_hist = pd.Series(resample(df.sum(), 16))dim2_normalized_hist = pd.Series(resample(df.T.sum(), 16))print(dim1_normalized_hist)print(dim2_normalized_hist)
DCT-离散余弦变换
离散余弦变换(DCT)用在不同频率振荡的余弦函数之和表示数据点的有限序列。DCT与DFT(离散傅立叶变换)不同,只有实部。DCT,尤其是DCT-II,通常用于信号和图像处理,尤其是用于有损压缩,因为它具有强大的“能量压缩”特性。在典型的应用中,大多数信号信息倾向于集中在DCT的几个低频分量中。我们可以在图像和转置图像上计算DCT向量,并取前k个元素。
from scipy.fftpack import dctdim1_dct = pd.Series(dct(df.sum())[0:8]).to_frame().Tdim2_dct = pd.Series(dct(df.T.sum())[0:8]).to_frame().T
dim1_normalize_dct = pd.Series(normalize(dim1_dct)[0].tolist())dim2_normalize_dct = pd.Series(normalize(dim2_dct)[0].tolist())
print(dim1_normalize_dct)print(dim2_normalize_dct)
结论
如今,CNN的使用正在增长,在本文中,我们试图解释和演示一些以老式方式从图像创建特征的经典方法,了解图像处理的基础是一种很好的做法,因为有时它更容易比将其推入网中更准确。本文是对图像的处理以及如何使用像素并从像素中提取知识的介绍,也许是对大脑的刺激。
相关文章:

课程第五天内容《基础交换 五》
2019独角兽企业重金招聘Python工程师标准>>> 以太网/LAN(local area network )的相关概念: 问题: 信号传输距离有限; 解决方案: 中继器 - 放大电信号,延长信息的传输距离࿱…

C#综合揭秘——Entity Framework 并发处理详解
引言 在软件开发过程中,并发控制是确保及时纠正由并发操作导致的错误的一种机制。从 ADO.NET 到 LINQ to SQL 再到如今的 ADO.NET Entity Framework,.NET 都为并发控制提供好良好的支持方案。 并发处理方式一般分为乐观必并发与悲观必并发两种࿰…

@2021高考生,用 Python 分析专业“钱景”
来源 | 关于数据分析于可视化头图 | 下载于ICphoto2021年的高考在昨日拉开帷幕,十年的寒窗苦读,终于到了最后见分晓的时候了。在这么一场关键的考试当中,除了考试前努力奋斗,考场上认真答题,考后的志愿填报也是极其的重…

Linux下C语言的fgets与fputs
使用的是 CentOS gcc编译下面程序 显示warning: the gets function is dangerous and should not be used.问题出在程序中使用了 gets Linux 下gcc编译器不支持这个函数,解决办法是使用 fgets fgets()函数的基本用法为: fgets(char * s,int size,FILE * …

linux发行版的用户交互
1 cli,即command line interface 纯命令行的交互方式,该命令行界面是由shell提供的。 linux内核本身也自带了一个console,即linux console,它是基于frame buffer的。 cli的界面都是基于ncurses库开发的。 2 GUI,graphi…

C#中在应用程序和DLL使用消息
在C#中采用的是事件驱动方式,但在我们使用的过程中,有时候通过调用系统原有的消息,处理起来会比较简单一些,特别是在处理与DLL文件的交互时,的确是非常的方便。 在C#中使用自定义消息 在C#中使用自定义消息非常简单&…

倪光南院士:openEuler与全球开发者共同推动计算产业发展
今日,以“创造最好的OS,成就更好的我们”为主题的 openEuler Developer Day 2021在北京成功举行。本次大会由openEuler社区发起,产业组织专家、学者、企业领袖和开发者们围绕多样性计算、云原生全栈、全场景协同等技术方向共同探讨和创新。大…

jhello框架-ajax
2019独角兽企业重金招聘Python工程师标准>>> 现在的web开发没有ajax都没法活,所以在jhello中实现了一个简单的ajax交互,使用json作为载体。 在上篇《交互》中讲到一种交互的方式是把数据放入Model中,通过ModelAndView类返回到视图…

发微信模版消息换行用\n
发微信模版消息换行用\n发微信模版消息换行用\n发微信模版消息换行用\n发微信模版消息换行用\n发微信模版消息换行用\n转载于:https://blog.51cto.com/xuqin/1974131

二次元会让人脸识别失效吗?
来源 | PyTorch 开发者社区责编 | 寇雪芹头图 | 下载于ICphoto人脸识别也遇到坑了,识别得了三次元,却对二次元无效。迪士尼的技术团队,正在开发这一算法,以帮助动画制作者进行后期搜索。团队利用 PyTorch,效率得到很大…

基于第四层交换技术的负载均衡
摘 要 本文介绍了第四层交换技术的概念,技术原理以及如何使用第四层交换技术实现远程教育系统中的应用服务器负载均衡。 作者: 凌仲权,现就读于西安电子科技大学,2001级硕士研究生。主要的科研方向为计算机网络技术研究以及远程教…

開始Unity3D的学习之旅
前言:这个系列的文章纯属对自己学习的整理,非高手之作。但确实的记载了我作为一个没接触过3D游戏编程的大学生的心路历程。争取每周整理一次吧。之所以会開始学Unity3D,最基本的原因是由于在快放暑假的时候,我找了一家做iPhone游戏…

linux 定时任务crond
1.定时任务crond 1.1 crond是什么 crond是linux系统中用来定期执行命令或指定程序任务的一种服务或软件。特殊需求:(秒级别)crond服务就无法搞定了,一般工作中写脚本守护进程执行。 为什么要使用crond定时任务: linux系…

用C#去除代码的SourceSafe管理
经常看一些的程序,有些一个解决方案带有多个项目,由于代码比较多,多人开发,所以好多vs.net下的工程是用source safe进行版本控制的。而用source safe进行版本控制需要局域网路径共享,因此好多项目换一台机器打开会出现…

用jarsigner对android apk进行签名
以前对apk重新打包签名都是用的apktool里面的Auto-sign 工具,后来发现有时候利用该工具对一些apk签名会失败,所以后来就使用 jarsigner这个工具,现记录一下这个工具的使用方法1 首先要生成一个自己的keyD:\>keytool -genkey -alias myKey…

利用java反射机制 读取配置文件 实现动态类载入以及动态类型转换
作者:54dabang 在spring的学习过程之中,我们能够看出通过配置文件来动态管理bean对象的优点(松耦合 能够让零散部分组成一个总体,而这些总体并不在意之间彼此的细节,从而达到了真正的物理上的疏散耦合,而非…

C#操作消息队列
public class QueueManage { /// /// 发送对象到队列中 /// /// 队列名称,因为队列名称在一个应用中应该不改变的,所以大家最好写在配置文件中 /// 要发出去的对象 public static void SendQueue(string QueuePath,MyBase.SmsQueue sq) { Syste…

2021《程序员》数字科技企业研发实力榜TOP50
互联网的盛行带来了众多数字科技企业的崛起,但如何客观地衡量每家企业的技术实力?研发投入、研发人才的数量和人才密度是关键指标。2021年5月,《程序员》根据相关企业披露的财报数据及市场调研数据,整理发布“2021数字科技企业研发实力榜TOP5…

eclipse中java项目转换为web项目
2019独角兽企业重金招聘Python工程师标准>>> 经常在eclipse中导入web项目时,出现转不了项目类型的问题,导入后就是一个java项目,有过很多次经历,今天也有同事遇到类似问题,就把这个解决方法记下来吧&#x…

MySQL · 引擎介绍 · Sphinx源码剖析(三)
在本节中我会介绍Sphinx在构建索引之前做的一些事情,主要是从mysql拉取数据保存,然后分词排序保存到内存等等一系列的操作。下面是几个相关指令 sql_query \SELECT id, group_id, UNIX_TIMESTAMP(date_added) AS date_added, \title, content \FROM doc…

C#给图片添加版权信息
现在越来越多的网站都喜欢将用户上传的图片加上网站的版权信息,不要以为那是用photoshop之类的图片处理软件加上去的,其实我们只要写一小段代码,就可以实现这个功能。 添加版权信息的原理其实挺简单:通过图片获取Graphics类的对象…

Python + 爬虫:可视化大屏帮你选粽子
来源 | 数据分析与统计学之美头图 | 下载于ICphoto端午节快要到了,旅游?回家?拜访亲友?少不了要带上粽子。那么,选择什么牌子的粽子呢?选择什么口味的粽子呢?选择什么价格区间呢?今年…

adviser vs mentor
研究生或博士生提到自己导师的时候是说adviser呢?还是mentor呢? 至少我认识一个Berkeley的博士是说adviser的。 另外,我的导师也是说adviser。 那还是说adviser吧……

T extends Serializable这是什么意思呢?看明白这个,你的问题就自然而然的明白了!...
1.转自:https://blog.csdn.net/liwenqiang758/article/details/8131185 自己动手丰衣足食!!! 泛型是Java SE 1.5的新特性,泛型的本质是参数化类型,也就是说所操作的数据类型被指定为一个参数。 这种参数类型可以用在类、接口和方法的创建中&a…

C#中switch语句注意
大家肯定对switch语句并不陌生,它能够让程序根据控制表达式的值,从多个动作中作出选择(从逻辑过程看,和多分支语句if-else有些相似)。在C和java中也有这一语句,不过在C#中,这一语句则有了些变化。先看下边一…

对Cost (%CPU) 粗略的理解
今天研究执行计划,看到执行计划里面有Cost (%CPU),我这边研究了一把,不知道对与否,拿出来晒晒在Oracle 10g中,Oracle 把CPU的cost也统计在执行计划中去了, 这和以前的8i,9i(9i其实已经开始了)有很大的不同。…

后疫情时代,RTC期待新的场景大爆发
整理 | 寇雪芹头图 | 下载于ICphoto出品 | AI 科技大本营(ID:rgznai100) 过去的一年中,新冠疫情悄然改变了社会发展和人们的生活,也助推了实时音视频(Real-Time Communication)技术的落地应用,数…

JS-DOM-元素节点
查看元素节点: 1、getElementById():通过 id 取到唯一节点;如果 id 重名,只能取到第一个 getElementByName(): 通过name属性 getElementByTagName(): 通过标签名 getElementByClassName(): 通过class名 获取元素节点时,一定要注意:获取节点的语句,必须在 DOM 渲染完成之后执行。…

现代软件工程 第十章 【典型用户和场景】 练习与讨论
1. 讨论:下面的老板犯了什么错误? 只看用户的表面语言或行动还是不够的。我们还要找到用户语言行动背后的动机! (图像来源: http://www.weibo.com/funnyshoelace) 2. 是否要文档 有人说,我们敏捷的团队,就喜欢直接的面对面的交流࿰…