传统图像特征处理方法:颜色直方图、SIFT、HOG

之前学过的机器学习都是对一些有标签的数据通过分类器进行学习,那么对带标签的图像如何进行学习呢? 
如果我们用一些特征来描述这些图片则也可以进行机器学习,因此我们来介绍几种常用的图像特征描述。(虽然现在有了CNN,CNN可以自己进行特征提取,但还是需要对OPenCV传统的特征提取方法有一些了解的)

我们对特征的描述是根据最后的应用场景设计特征,如应用场景更关心颜色则用颜色特征,因此无普适性( 但是CNN可以自适应学习出相应的特征)。

颜色特征
什么是颜色特征
颜色特征是图像检索中应用最为广泛的视觉特征。

如何描述颜色特征
我们可以通过颜色直方图来描述颜色特征。 
从512x512的灰度图像中提取维度为k的颜色直方图,就是讲256种灰度颜色分为k个区间,然后计算每个区间中像素点总数为多少。

举个例子
import cv2
import numpy as np
img_gray_data = cv2.imread('./images/messi.jpg', cv2.IMREAD_GRAYSCALE)

hist, bins = np.histogram(img_gray_data.ravel(), bins=50)

print(hist)
print(bins)
纹理特征


形状特征
形状特征的表达必须以对图像中物体或区域的分割为基础。 
两种经典的算法是SIFT和HOG。 
Sift是先找特征点,而hog是对图片进行分割。

SIFT (Scale-invariant feature transform)
SIFT在尺度空间中所提取的图像局部特征点。

SIFT特征优点
SIFT特征点提取较为方便,提取速度较快,对于图像的缩放等变换比较鲁棒,因此得到了广泛的应用。

SIFT算法的步骤


①构造尺度空间 
把图像按比例进行缩小 
②搜索尺度空间中的关键点 
关键点就是角点或者拐点 
③去除可能的噪音点 
噪音点如梯度变化较小的点,就不考虑进去 
④计算方向构造128维的特征向量 
计算每个特征点的向量,每个向量是128维。 
如下图中(a)绿色点是一个特征点,然后SIFT就会算出和他相邻的点的梯度上的直方图,最后把这些直方图组合成一个128维的向量 


在openCV中使用SIFT特征提取
初始化特征方法

cv2.xfeatures2d.SIFT_create()

检测特征点并计算特征向量

kp, desc = sift.detectAndCompute(img, None)

返回值为 
kp:特征点 
desc:描述器,维度是二维的,行为特征点,列为128个。即把原来的图片变成一个二维矩阵,这个数据可放到机器学习模型中进行学习。 
desc.shape 
输出为(638, 128)。 638为特征点

print('该图像共有{}个特征点,每个特征点对应的特征维度是{}'.format(desc.shape[0], desc.shape[1]))
1
输出:该图像共有638个特征点,每个特征点对应的特征维度是128

画出特征点

img_w_kp = cv2.drawKeypoints(img, kp, None, flags=cv2.DRAW_MATCHES_FLAGS_DRAW_RICH_KEYPOINTS)

 

img = cv2.imread('./images/messi.jpg', cv2.IMREAD_GRAYSCALE)
sift = cv2.xfeatures2d.SIFT_create() #初始化特征方法
kp, desc = sift.detectAndCompute(img, None)#检测特征点并计算特征向量
#画出特征点
img_w_kp = cv2.drawKeypoints(img, kp, None, flags=cv2.DRAW_MATCHES_FLAGS_DRAW_RICH_KEYPOINTS)
cv2.imshow('img_w_kp', img_w_kp)
cv2.waitKey(0)
cv2.destroyAllWindows()
圆心代表特征点,圆的大小代表梯度的大小,竖线代表梯度的方向即在此方向颜色变化较大 


HOG (Histogram of Oriented Gradient)
什么是HOG特征
用于检测物体的特征描述,通过计算和统计图像局部区域的梯度方向直方图来构建特征。

HOG特征的作用/优点
HOG特征特别适合于做图像中的人体检测 
由于HOG是在图像的局部方格单元上操作,所以它对图像几何的和光学的形变都能保持很好的不变性。 
在粗的空域抽样、精细的方向抽样以及较强的局部光学归一化等条件下,只要行人大体上能够保持直立的姿势,可以容许行人有一些细微的肢体动作,这些细微的动作可以被忽略而不影响检测效果。

HOG特征步骤
它是假设每个区域都有关键的特征,所以是对每个区域都进行操作。 
①input image 
输入图片 
②normalise 
对图像进行均值化操作 
③Compute gradients 
计算梯度,梯度就是变化比较大的区域,这样就可以找到人形的轮廓。 
④Accumulate 
计算每个cell里的梯度方向和值 
⑤ 
将每个cell的特征向量合起来作为整个图片的 


在openCV中使用HOG特征提取
初始化特征方法

cv2.HOGDescriptor()

计算特征

img = cv2.imread('./images/messi.jpg', cv2.IMREAD_GRAYSCALE)
hog = cv2.HOGDescriptor() #初始化特征方法
hist = hog.compute(img)# 计算特征
print('HOG特征维度:', hist.shape)


结果: 
HOG特征维度: (6225660, 1)

OPenCV中的特征方法
其他的OPenCV特征方法可以从官方网站中查看 
https://docs.opencv.org/3.0- beta/doc/py_tutorials/py_feature2d/py_table_of_contents_feature2d/py_t able_of_contents_feature2d.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值