方向梯度直方图(Histogram of Oriented Gradient,HOG)特征是一种在计算机视觉和图像处理中用来进行物体检测的特征描述子。它通过计算和统计图像局部区域的梯度方向直方图来构成特征。HOG特征结合SVM分类器已经被广泛应用于图像识别中,尤其在行人检测中获得了极大的成功。HOG+SVM进行行人检测的方法是法国研究人员Dalal在2005的CVPR上提出的,如今虽然有很多行人检测算法不断提出,但基本都是以HOG+SVM的思路为主。HOG特征的提取过程如下:
1) 标准化gamma空间和颜色空间 为了减少光照因素的影响,首先需要将整个图像进行规范化(归一化)。在图像的纹理强度中,局部的表层曝光贡献的比重较大,所以,这种压缩处理能够有效地降低图像局部的阴影和光照变化。因为颜色信息作用不大,通常先转化为灰度图。Gamma压缩公式为: I(x,y)?I(x,y)gamma 可以取gamma?12。 2) 计算图像梯度 计算图像横坐标和纵坐标方向的梯度,并据此计算每个像素位置的梯度方向值,梯度特征可以弱化光照的影响。 图像中像素点(x,y)的梯度为: Gx(x,y)?I(x?1,y)?I(x?1,y)Gy(x,y)?I(x,y?1)?I(x,y?1), 其中,Gx(x,y)、Gy(x,y)和I(x,y)分别表示输入图像中像素点(x,y)处的水平方向梯度、垂直方向梯度和像素值。像素点(x,y)处的梯度幅值和梯度方向分别为:
G(x,y)?Gx(x,y)2?Gy(x,y)2 ?(x,y)?tan(?1Gy(x,y)Gx(x,y), )3) 为每个细胞单元构建梯度方向直方图 6
这一步的目的是为局部图像区域提供一个编码。将图像分成若干个“单元格cell”,例如每个cell为6*6个像素。假设采用9个bin的直方图来统计这6*6个像素的梯度信息。也就是将cell的梯度方向360度分成9个方向块,如图所示:
例如:如果这个像素的梯度方向是20-40度,直方图第2个bin的计数就加上这个像素的梯度幅值,这样,对cell内每个像素用梯度方向在直方图中进行加权投影(映射到固定的角度范围),就可以得到这个cell的梯度方向直方图了,就是该cell对应的9维特征向量(因为有9个bin)。
4) 把细胞单元组合成大的块(block),块内归一化梯度直方图
由于局部光照的变化以及前景-背景对比度的变化,使得梯度强度的变化范围非常大。这就需要对梯度强度做归一化。归一化能够进一步地对光照、阴影和边缘进行压缩。方法是:把各个细胞单元组合成大的、空间上连通的区间(blocks)。这样,一个block内所有cell的特征向量串联起来便得到该block的HOG特征。这些区间是互有重叠的,这就意味着:每一个单元格的特征会以不同的结果多次出现在最后的特征向量中,归一化之后的块描述符(向量)就称之为HOG描述符。
5) 收集HOG特征
最后一步就是将检测窗口中所有重叠的块进行HOG特征的收集,并将它们结合成最终的特征向量供分类器使用。
2、 SIFT特征
SIFT特征是具有尺度不变性的局部特征检测算法。整个算法分为以下几个部分:
1) 构建尺度空间
7
这是一个初始化操作,通过生成尺度空间来创建原始图像的多层表示以保证尺度不变性。高斯卷积核是实现尺度变换的唯一线性核,一幅二维图像的尺度空间定义为:
L(x,y,?)?G(x,y,?)?I(x,y), 其中,?表示卷积,G(x,y,?)是尺度可变高斯函数: G(x,y,?)?12??2e?(x2?y2)2?2, (x,y)是空间坐标,?的大小决定图像的平滑程度,大尺度对应图像的概貌特征,小尺度对应图像的细节特征。大的?值对应粗糙尺度(低分辨率),反之,对应精细尺度(高分辨率)。为了有效的在尺度空间检测到稳定的关键点,提出了高斯差分尺度空间(DOG scale-space)。利用不同尺度的高斯差分核与图像卷积生成。 D(x,y,?)?(G(x,y,k?)?G(x,y,?))*I(x,y)。 ?L(x,y,k?)?L(x,y,?)图像金字塔的建立:对于一幅图像I,建立其在不同尺度(scale)上的图像,也成为子八度(octave),这是为了仿射不变性,也就是在任何尺度都能够有对应的特征点,第一个子八度的尺度为原图大小,后面每个octave为上一个octave降采样的结果,即原图的1/4(长宽分别减半),构成下一个子八度(高一层金字塔)。 2) LoG近似DoG找到关键点(检测DOG尺度空间极值点) 使用Laplacian of Gaussian能够很好的找到图像中的兴趣点,但是需要大量的计算量,所以使用Difference of Gaussian图像的极大极小值近似寻找特征点。为了寻找尺度空间的极值点,每一个采样点要和它所有的相邻点比较,看其是否比它的图像域和尺度域的相邻点大或者小。如图所示, 8
中间的检测点和它同尺度的8个相邻点和上下相邻尺度对应的9×2个点共26个点比较,以确保在尺度空间和二维图像空间都检测到极值点。一个点如果在DOG尺度空间本层以及上下两层的26个领域中是最大或最小值时,就认为该点是图像在该尺度下的一个特征点。
在极值比较的过程中,每一组图像的首末两层是无法进行极值比较的,为了满足尺度变化的连续性,在每一组图像的顶层继续用高斯模糊生成3 幅图像,所以,高斯金字塔有每组S+3层图像,DOG金字塔每组有S+2层图像。 3) 除去不好的特征点
这一步本质上要去掉DoG局部曲率非常不对称的像素。通过拟和三维二次函数精确确定关键点的位置和尺度(达到亚像素精度),同时去除低对比度的关键点和不稳定的边缘响应点(因为DoG算子会产生较强的边缘响应),以增强匹配稳定性、提高抗噪声能力,使用近似Harris角点检测器。
① 空间尺度函数泰勒展开式如下: ?DT1T?2DD(x)?D?x?xx, ?x2?x2对上式求导,并令其为0,得到精确的位置, ?2D?1?D???x。 2?x?x② 已经检测到的特征点中,要去掉低对比度的特征点和不稳定的边缘响应点。去除低对比度的点,即在DoG空间的极值点D(x)处取值,只取前两项可得: 1?DT?)?D??, D(xx2?x??0.03,该特征点就保留下来,否则丢弃。 若D(x)③ 边缘响应的去除 一个定义不好的高斯差分算子的极值在横跨边缘的地方有较大的主曲率,而在垂直边缘的方向有较小的主曲率。主曲率通过一个2×2 的Hessian矩阵H求出: ?Dxx Dxy?H??? D D??xyyy??9
导数由采样点相邻差估计得到。D的主曲率和H的特征值成正比,令?为较大特征值,?为较小的特征值,则 Tr(H)?Dxx?Dyy????Det(H)?DxxDyy?(Dxy)???2, 令??r?,则 Tr(H)2(???)2(r???)2(r?1)2 ???Det(H)??r?2r (r?1)2r的值在两个特征值相等的时候最小,随着r的增大而增大,因此,为了检测主曲率是否在某域值?下,只需检测 Tr(H)2(??1)2, ?Det(H)?如果(???)???(r?1)2r,去除该特征点。在SIFT的经典文章中,取??10。 ④ 给特征点赋值一个128维方向参数 上一步中确定了每幅图中的特征点,为每个特征点计算一个方向,依照这个方向做进一步的计算, 利用关键点邻域像素的梯度方向分布特性为每个关键点指定方向参数,使算子具备旋转不变性。 m(x,y)?(L(x?1,y)?L(x?1,y))2?(L(x,y?1)?L(x,y?1))2?(x,y)?atan2(L(x,y?1)?L(x,y?1),L(x?1,y)?L(x?1,y)) 为(x,y)处梯度的模值和方向公式。其中L所用的尺度为每个关键点各自所在的尺度。至此,图像的关键点已经检测完毕,每个关键点有三个信息:位置,所处尺度、方向,由此可以确定一个SIFT特征区域。 在实际计算时,在以关键点为中心的邻域窗口内采样,并用直方图统计邻域像素的梯度方向。梯度方向直方图的范围是0~360度,其中每45度一个柱,总共8个柱。Lowe论文中还提到要使用高斯函数对直方图进行平滑,减少突变的影响。直方图的峰值则代表了该关键点处邻域梯度的主方向,即作为该关键点的方向,其他的达到最大值80%的方向可作为辅助方向。该步中将建立所有尺度中特征点的描述子(128维)。通过对关键点周围图像区域分块,计算块内梯度直10