HOG特征
1、HOG特征:
方向梯度直方图(Histogram of Oriented Gradient, HOG)特征是一种在计算机视觉和图像处理中用来进行物体检测的特征描述子。它通过计算和统计图像局部区域的梯度方向直方图来构成特征。
(1)主要思想:
在一副图像中,局部目标的表象和形状(appearance and shape)能够被梯度或边缘的方向密度分布很好地描述。
(2)具体的实现方法是:
首先将图像分成小的连通区域,我们把它叫细胞单元。然后采集细胞单元中各像素点的梯度的或边缘的方向直方图。最后把这些直方图组合起来就可以构成特征描述器。
2、HOG特征提取算法的实现过程:(参照网上)
大概过程:
HOG特征提取方法就是将一个image(你要检测的目标或者扫描窗口):
1)灰度化(将图像看做一个x,y,z(灰度)的三维图像);
2)采用Gamma校正法对输入图像进行颜色空间的标准化(归一化);目的是调节图像的对比度,降低图像局部的阴影和光照变化所造成的影响,同时可以抑制噪音的干扰;
3)计算图像每个像素的梯度(包括大小和方向);主要是为了捕获轮廓信息,同时进一步弱化光照的干扰。
4)将图像划分成小cells(例如8*8像素/cell);
5)统计每个cell的梯度直方图(不同梯度的个数),即可形成每个cell的descriptor;
6)将每几个cell组成一个block(例如2*2个cell/block),一个block内所有cell的特征descriptor串联起来便得到该block的HOG特征descriptor。
7)将图像image内的所有block的HOG特征descriptor串联起来就可以得到该image(你要检测的目标)的HOG特征descriptor了。这个就是最终的可供分类使用的特征向量了。
OPENCV 中的HOGDescriptor的两个构造函数
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)
{}
CV_WRAP HOGDescriptor(Size _winSize, Size _blockSize, Size _blockStride,
Size _cellSize, int _nbins, int _derivAperture=1, double _winSigma=-1,
int _histogramNormType=HOGDescriptor::L2Hys,
double _L2HysThreshold=0.2, bool _gammaCorrection=false,
int _nlevels=HOGDescriptor::DEFAULT_NLEVELS)
: winSize(_winSize), blockSize(_blockSize), blockStride(_blockStride), cellSize(_cellSize),
nbins(_nbins), derivAperture(_derivAperture), winSigma(_winSigma),
histogramNormType(_histogramNormType), L2HysThreshold(_L2HysThreshold),
gammaCorrection(_gammaCorrection), nlevels(_nlevels)
{}
主要对winSize(64,128), blockSize(16,16), blockStride(8,8), cellSize(8,8), nbins(9)个参数进行分析。
窗口大小 winSize
块大小 blockSize
胞元大小 cellSize
梯度方向数 nbins
nBins表示在一个胞元(cell)中统计梯度的方向数目,例如nBins=9时,在一个胞元内统计9个方向的梯度直方图,每个方向为180/9=20度。
每个cell的梯度方向分成z个方向块,使用cell中的梯度方向和幅度对z个方向进行加权投影,最后每个cell产生z维的特征向量。Dalal等用于人体检测的HOG选取z=9,即将360度分成9个方向块,继而用于对方向梯度进行投影,如下图:
自己调用的函数
HOGDescriptor *hog=new HOGDescriptor(cvSize(16,32),cvSize(16,16),cvSize(8,8),cvSize(8,8),9);
vector
hog->compute(trainImg, descriptors,Size(1,1), Size(0,0));
图片大小 : cvSize(16,32)
窗口大小 winSize :cvSize(16,32) 所以只有一个窗口
块大小 blockSize cvSize(16,16)
滑动窗口大小_blockStride cvSize(8,8)
胞元大小 cellSize cvSize(8,8)
梯度方向数 nbins 9
特征值维数的计算
((32-16)/8+1) *((16-16)/8+1) =3 分成的块数(要考虑到滑动)
(16/8)*(16/8)=4 胞元数
每个胞元数有9个bin(这个数字是自己设定的,默认值为9)
总的维数 = 3*4*9=108