图像局部纹理特征——HOG(Histogram of Oriented Gradient)

文章主要参考自 目标检测的图像特征提取之(一)HOG特征 和 OpenCV HOGDescriptor 参数图解

一、HOG的定义

HOG(方向梯度直方图)特征是一种在计算机视觉和图像处理中用来进行物体检测的特征描述子。它通过计算和统计图像局部区域的梯度方向直方图来构成特征。

二、HOG特征的提取步骤

1)因为颜色信息作用不大,所以对目标图像进行灰度化;

2)采用Gamma校正法对灰度图进行标准化(归一化);目的是调节图像的对比度,降低图像局部的阴影和光照变化所造成的影响,同时可以抑制噪音的干扰;

3)计算灰度图每个像素的梯度(包括大小和方向);主要是为了捕获轮廓信息,同时进一步弱化光照的干扰。

最常用的方法是:首先用[-1,0,1]梯度算子(例如Sobel)对原图像做卷积运算,得到x方向(水平方向,以向右为正方向)的梯度分量gradscalx,然后用[1,0,-1]T梯度算子对原图像做卷积运算,得到y方向(竖直方向,以向上为正方向)的梯度分量gradscaly。然后再用以下公式计算该像素点的梯度大小和方向。

图像局部纹理特征——HOG(Histogram of Oriented Gradient)_第1张图片

4)将图像划分成小cells(例如8*8像素大小的cell);


图像局部纹理特征——HOG(Histogram of Oriented Gradient)_第2张图片

5)统计每个cell的梯度直方图(不同梯度的个数),即可形成每个cell的descriptor;

该步骤的目的是为局部图像区域(cell)提供一个编码,同时能够保持对图像中人体对象的姿势和外观的弱敏感性。

我们将图像分成若干个“cell”,例如每个cell为8*8个像素。假设我们采用9个bin的直方图来统计这8*8个像素的梯度信息。也就是将cell的梯度方向360度分成9个方向块,如图所示:例如:如果这个像素的梯度方向是20-40度,直方图第2个bin的计数就加一,这样,对cell内每个像素用梯度方向在直方图中进行加权投影(映射到固定的角度范围),就可以得到这个cell的梯度方向直方图了,就是该cell对应的9维特征向量(因为有9个bin)。

如下图所示(图中Zi块其实就是第i个bin)


图像局部纹理特征——HOG(Histogram of Oriented Gradient)_第3张图片

像素梯度方向用到了,那么梯度大小呢?梯度大小就是作为投影的权值的。例如说:这个像素的梯度方向是20-40度,然后它的梯度大小是2(假设啊),那么直方图第2个bin的计数就不是加一了,而是加二(假设啊)

6)将每几个cell组成一个block(例如 大小为16*16的block,即一个block由4个cell组成),一个block内所有cell的特征descriptor串联起来便得到该block的HOG特征descriptor。

由于局部光照的变化以及前景-背景对比度的变化,使得梯度强度的变化范围非常大。这就需要对梯度强度做归一化。归一化能够进一步地对光照、阴影和边缘进行压缩。

作者采取的办法是:把各个细胞单元组合成大的、空间上连通的区间(blocks)。这样,一个block内所有cell的特征向量串联起来便得到该block的HOG特征。这些区间是互有重叠的(滑动块,例如block stride为8),这就意味着:每一个单元格的特征会以不同的结果多次出现在最后的特征向量中。我们将归一化之后的块描述符(向量)就称之为HOG描述符。


图像局部纹理特征——HOG(Histogram of Oriented Gradient)_第4张图片


7)将图像image内的所有block的HOG特征descriptor串联起来就可以得到该image(你要检测的目标)的HOG特征descriptor了。这个就是最终的可供分类使用的特征向量了。

最后一步就是将检测窗口中所有重叠的块进行HOG特征的收集,并将它们结合成最终的特征向量供分类使用。

例如行人检测的滑动窗口大小通常为 64*128

图像局部纹理特征——HOG(Histogram of Oriented Gradient)_第5张图片

以OpenCV为例,构建 HOG 特征的默认参数设置如下:

CV_WRAP HOGDescriptor() : winSize(64,128), blockSize(16,16), blockStride(8,8),

cellSize(8,8), nbins(9), derivAperture(1), winSigma(-1),

histogramNormType(HOGDescriptor::L2Hys), L2HysThreshold(0.2), gammaCorrection(true),

nlevels(HOGDescriptor::DEFAULT_NLEVELS)

{}

8)特征向量的维数

Dalal提出的Hog特征提取的过程:把样本图像分割为若干个像素的单元(cell),把梯度方向平均划分为9个区间(bin),在每个单元里面对所有像素的梯度方向在各个方向区间进行直方图统计,得到一个9维的特征向量,每相邻的4个单元(cell)构成一个块(block),把一个块内的特征向量联起来得到36维的特征向量,用块对样本图像进行扫描,扫描步长为一个单元(block_stride = 8)。最后将所有块的特征串联起来,就得到了人体的特征。例如,对于64*128的图像而言,每16*16的像素组成一个cell,每2*2个cell组成一个块,因为每个cell有9个特征,所以每个块内有4*9=36个特征,以8个像素为步长,那么,水平方向将有7个扫描窗口,垂直方向将有15个扫描窗口。也就是说,64*128的图片,总共有36*7*15=3780个特征。

总体流程图:

图像局部纹理特征——HOG(Histogram of Oriented Gradient)_第6张图片

你可能感兴趣的:(图像局部纹理特征——HOG(Histogram of Oriented Gradient))