之前学过的机器学习都是对一些有标签的数据通过分类器进行学习,那么对带标签的图像如何进行学习呢?
如果我们用一些特征来描述这些图片则也可以进行机器学习,因此我们来介绍几种常用的图像特征描述。(虽然现在有了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 (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特征的作用/优点
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