Hog模块划分:
首先明确几个概念,下图中:
image:整幅图片;win窗体:蓝色部分;block:红色部分;cell:红色部分中的四个绿色部分;
Dalal提出的Hog特征提取的过程:把样本图像分割为若干个像素的单元(cell),把梯度方向平均划分为9个区间(bin),在每个单元里面对所有像素的梯度方向在各个方向区间进行直方图统计,得到一个9维的特征向量,每相邻的4个单元构成一个块(block),把一个块内的特征向量联起来得到36维的特征向量,用块对样本图像进行扫描,扫描步长为一个单元。最后将所有块的特征串联起来,就得到了人体的特征。例如,对于64*128的图像而言,每8*8的像素组成一个cell,每2*2个cell组成一个块,因为每个cell有9个特征,所以每个块内有4*9=36个特征,以8个像素为步长,那么,水平方向将有7个扫描窗口,垂直方向将有15个扫描窗口。也就是说,64*128的图片,总共有36*7*15=3780个特征。
HOG维数,16×16像素组成的block,8x8像素的cell
我们知道Hog是利用滑框实现的,则引出一个概念:步长;bloc的step,win的step,cell的bin;
一般来说;win是特征计算的最顶层单元;也就是说,一个win包含其对应目标的全部参数;
block一般小于win,win的宽度和高度一般是block的宽高的整数倍;因此block的步长就是block遍历win时,滑动多少像素;
sell的size由block的size作参考;cell不可滑动(如图:Hog特征计算)
cell的bin是什么意思呢?
前面我们学习过梯度,在计算每个像素的梯度时,包含梯度的幅值和方向;其中bin和方向有关;
一个圆是0-360度,每40度划分一个圆,共9个;这就是bin;每40度划分的一块;一个·bin=40度(如图:Hog特征计算)
一个cell要包含一个完整的360度信息,则刚好9个bin;
前面说过harr特征得到的是一个值(白色-黑色);而Hog特征得到的是一个向量(向量的维度);
则Hog维度=block的个数*cell个数*cell中bin的个数;
官方推荐win的size是64*128;16×16像素组成的block,8x8像素的cell;block步长为8个像素;则block count=((64-16)/8+1)*(128-16)/8+1)=105 block;
一个block=4 个cell(16*16=2*(8*8)) ;及cell1、2、3、4;
HOG维数=105*4*9=3780;
前面提到梯度,我们知道hog得到的是一个向量,那么hog的梯度如何计算呢?
其计算方法与harr类似,用到特征模板;
水平模板:[1 0 -1],竖直模板:[ [1] [0] [-1] ];
则模板和对应像素的乘积:
则梯度的幅值=√(a2+b2),角度=arctan(a/b)
前面提到梯度,梯度是基于像素的,每一个像素都有梯度;梯度计算知道了,那bin的投影如何计算呢
前面说过一个圆是0-360度,每40度划分一个圆,共9个;这就是bin;每40度划分的一块;一个·bin=40度(如图:Hog特征计算),
每一个0-40度大小的bin不是连续的,也就是说0-40度的投影属于两个bin;只有0-20的bin是连续的,20-40又是一个连续的块;
及bin1: 0-20, 180-200;这两个块投影属于一个bin;如下图:
对于一个像素i,j;其梯度幅值f,角度为a;
若a=10;则其投影在bin1;若a=190,则其投影也在bin1
那幅值f如何计算呢:
方法1(参考:HOG 特征原理):https://blog.csdn.net/q1007729991/article/details/53032776
方法2:参考:HOG特征:https://www.zhihu.com/collection/282778463
总结一下Hog特征:
HOG特征:
方向梯度直方图(Histogram of Oriented Gradient, HOG)特征是一种在计算机视觉和图像处理中用来进行物体检测的特征描述子。它通过计算和统计图像局部区域的梯度方向直方图来构成特征。Hog特征结合SVM分类器已经被广泛应用于图像识别中,尤其在行人检测中获得了极大的成功。
HOG特征提取方法就是将一个image(你要检测的目标或者扫描窗口):
1)灰度化(将图像看做一个x,y,z(灰度)的三维图像);
2)采用Gamma校正法对输入图像进行颜色空间的标准化(归一化);目的是调节图像的对比度,降低图像局部的阴影和光照变化所造成的影响,同时可以抑制噪音的干扰;
3)计算图像每个像素的梯度(包括大小和方向);主要是为了捕获轮廓信息,同时进一步弱化光照的干扰。
4)将图像划分成小cells(例如6*6像素/cell);
5)统计每个cell的梯度直方图(不同梯度的个数),即可形成每个cell的descriptor;
6)将每几个cell组成一个block(例如3*3个cell/block),一个block内所有cell的特征descriptor串联起来便得到该block的HOG特征descriptor。
7)将图像image内的所有block的HOG特征descriptor串联起来就可以得到该image(你要检测的目标)的HOG特征descriptor了。
下面这篇文章一定需要好好看看:opencv源码解析之(6):hog源码分析
参考:OpenCV+TensorFlow 入门人工智能图像处理
Hog特征提取 openCV:这篇文章中开头参考的大神讲的好;