1.图像特征
图像和声音是以数字像素或波形来记录的。图像中的单个“原子”是一个像素。在音频数据中,基本单位是对波形密度的一次测量。这些单位包含的语义信息要比文本数据的基本单位(单词)少。因此,与文本相比,图像和音频上的特征提取和特征工程要困难得多。
计算机视觉研究的重点是人工定义的用于提取良好图像特征的流程。有一段时间,像 SIFT 和 HOG(后文中会介绍)这样的图像特征提取器曾经成为了标准。近期深度学习研究的发展扩展了传统机器学习模型的应用范围,它们在基础层中集成了自动特征提取技术。这种扩展实质上是使用人工定义的能自动学习和提取特征的模型代替人工定义的特征图像提取器。人工工作依然存在,只是更加深入地抽象到了建模过程内部。
2.人工特征提取:SIFT 和 HOG
两种技术本质上都是计算梯度方向上的直方图。
SIFT(尺度不变特征转换):使用的是小块图像的统计量。SIFT 最初是为对象识别任务而开发的。对象识别不仅要正确地标注出图像中包含某种对象,还要确定对象在图像中的位置。对象识别过程包括在各种可能的尺度层次上分析图像,检测能够表示对象存在的有趣的点,提取这些有趣的点的相关特征以及确定对象的姿态。SIFT仅仅用于我们感兴趣的点,还可以提取整个图像的特征。
HOG(梯度方向直方图):与SIFT类似。
2.1图像梯度
要想比原始像素值做得更好,必须以某种方式将像素“组织”成信息量更大的单位。相邻像素之间的差别通常是非常有用的。像素值一般在对象的边界发生改变,比如一片阴影,一个模式之中,或者一个纹理表面。相邻像素在值上的差异称为图像梯度。
计算图像梯度的最简单方法是先沿着图像的横轴(x)和纵轴(y)分别计算像素值的差异,然后将计算结果组合到一个二维向量中。这需要两个一维差分操作,可以用向量掩膜或滤波器方便地表示。掩膜 [1, 0, –1] 既可以计算左邻和右邻之间的差异,也可以计算上邻和下邻之间的差异,这取决于应用掩码的方向。也可以使用二维梯度滤波器。
对图像应用滤波器,可以执行一个卷积操作:先对滤波器做个翻转,再与一小块图像做内积,然后移动到下一小块。卷积是信号处理中的常用操作,我们使用 * 来表示这种操作:[a b c] * [1 2 3] = c* 1 + b* 2 + a* 3 ;
像素 (i, j) 的 x 梯度和 y 梯度分别是:
放在一起,它们就构成了梯度:
向量可以完全由它的方向和大小来表示。梯度大小等于梯度的欧几里得范数根号(x梯度平方+y梯度平方),它表示像素周围的像素值变化的程度。梯度方向取决于水平和垂直方向上改变的相对大小。
import matplotlib.pyplot as plt
%matplotlib notebook
import numpy as np
from skimage.feature import hog
from skimage import data, color, exposure
# 加载图像,并转换为灰度图
image = color.rgb2gray(data.chelsea())
# 使用中心化的一维滤波器计算水平梯度。这等价于将每个非边界像素替换为 它的左侧相邻像素和右侧相邻像素的差。最左边和最右边上的像素的梯度是
# HOG特征提取
gx = np.empty(image.shape, dtype=np.double)
gx[:, 0] = 0
gx[:, -1] = 0
gx[:, 1:-1] = image[:, :-2] - image[:, 2:]
# 以同样的方式计算垂直梯度
gy = np.empty(image.shape, dtype=np.double)
gy[0, :] = 0
gy[-1, :] = 0
gy[1:-