【计算机视觉】5.常用的图像特征描述

  • Post author:
  • Post category:其他


之前学过的机器学习都是对一些有标签的数据通过分类器进行学习,那么对带标签的图像如何进行学习呢?

如果我们用一些特征来描述这些图片则也可以进行机器学习,因此我们来介绍几种常用的图像特征描述。(虽然现在有了CNN,CNN可以自己进行特征提取,但还是需要对OPenCV传统的特征提取方法有一些了解的)

我们对特征的描述是根据最后的应用场景设计特征,如应用场景更关心颜色则用颜色特征,

因此无普适性

( 但是CNN可以自适应学习出相应的特征)。

颜色特征

什么是颜色特征

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

如何描述颜色特征

我们可以通过

颜色直方图

来描述颜色特征。

从512×512的灰度图像中提取维度为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]))

输出:该图像共有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()

计算特征

hog.compute(img)

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



版权声明:本文为zxfhahaha原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。