特征提取之HOG特征
方向梯度直方图(Histogram of Oriented Gradient,HOG)是一种在计算机视觉和图像处理中用来对物体进行检测的特征描述子。
其特征提取的过程为:
(1)灰度化。
(2)采用Gamma校正法对图像进行颜色空间的归一化:是为了调节图像的对比度,降低图像局部的阴影和光照变化造成的影响,同时抑制噪声的干扰。Gamma压缩公式:

一般情况Gamma=1/2。
(3)计算图像每个像素的梯度(大小和方向)。

(4)将图像划分成小cells。
(5)统计每个cell的梯度直方图(不同梯度的个数),即可形成每个cell的descriptor。目的是为局部图像区域提供一个编码,同时保持对图像中物体对象的姿势和外观敏感性。假如每个cell为6*6个像素,采用9个bin的直方图来统计,即将360度分成9个方向块。若一个像素的梯度方向为20~40度(为第2个bin),梯度大小为1(2),则第2个bin的计数加上1(2)。

(6)每几个cell组成一个block,将block中的所有cell的特征descriptor串联起来就是这个block的HOG特征值。
(7)最后就是统一所有的block得到图像的HOG特征值。
HOGDescriptor(cvSize(64, 48),
cvSize(32, 32),
cvSize(8, 8),
cvSize(16, 16),
9);
参数1:滑动窗口的大小。
参数2:block大小。
参数3:block的移动步长。
参数4:cell大小。
参数5:bins个数。
hog->compute(dst,
feature,
Size(64, 48),
Size(0, 0));
参数1:输入图像。
参数2:输出的HOG特征向量。
参数3:窗口移动步长。
参数4:图像的padding补偿,有时候图像大小不能整除窗口大小,所以需要在周围补偿像素。
#include <opencv2\core\core.hpp>
#include <opencv2\highgui\highgui.hpp>
#include <opencv2\imgproc\imgproc.hpp>
#include <iostream>
#include <objdetect\objdetect.hpp>
using namespace cv;
using namespace std;
int main(){
Mat img = imread("D:/img/1.jpg"); // 570:700
Mat dst;
resize(img, dst, Size(640, 480)); //图像缩放 640:480
namedWindow("src");
imshow("src", dst);
HOGDescriptor *hog = new HOGDescriptor(cvSize(64, 48), cvSize(32, 32),
cvSize(8, 8), cvSize(16, 16), 9);
vector<float> feature;
hog->compute(dst, feature, Size(64, 48), Size(0, 0));
cout << "result:" << feature.size() << endl;
waitKey(0);
return 0;
}
block大小:32*32
cell大小:16*16
block中cell个数:(32*32)/(16*16)=4
bin:9
一个block的维度:4*9=36
滑动窗口大小:64*48
block大小:32*32
block步长:8,8
block横向扫描次数:(64-32)/8+1=5; block纵向扫描次数:(48-32)/8+1=3;
共扫描:5*3=15次
图像大小:640*480
滑动窗口大小:64*48
窗口移动步长:64,48
窗口横向扫描次数:(640-64)/64+1=10; 窗口纵向扫描次数:(480-48)/48+1=10;
共扫描:10*10=100次
整幅图像的特征维度大小为:36*15*100=54000