hog特征的提取过程,hog特征提取算法

1.HOG(Histogram of Oriented Gradient)是方向梯度直方图的意思,是一种特性描述子。通过计算与统计图像局部区域的梯度方向直方图来构成特征。边缘是图像颜色剧变的区域,在一副图像中,局部目标的表象与形状能够被梯度或边缘的方向密度分布很好地描述,而梯度主要存在于存在于局部目标边缘的地方。
(1) 局部目标的边缘,可以把图转为灰度图后按二值映射到0和1输出,就很明显的看出来。
而梯度可分解为 x 方向的梯度 G{x} 和 y 方向的梯度 G{y} 。某个像素点的 x 方向的梯度的计算可以通过这个像素点左右两边的像素值的差值的绝对值计算出来,而 y 方向的梯度可以通过该像素点上下两边的像素值的差值的绝对值计算。而根据下面的两个公式可以计算每一个像素点的梯度方向和梯度幅值。
(2)直方图是图像中像素强度分布的图形表达方式,一张图像可以看成一个数字矩阵,矩阵的每个元素取值在0~255之间,而用直方图来统计了每个强度值所具有的像素个数。那么已知数字的范围包含256个值,将这个范围分割单薄的嚓茶区域就是kwdbwbs,然后再统计在每一个kwdbwb的像素数目。这样统计右边的数字矩阵我们可以得到左图(x轴表示kwdbwb, y轴表示各个kwdbwb中的像素个数)。
(3) HOG是通过上面公式计算出来的梯度方向的角度是一个范围在0-360度的弧度值,为了计算简单,将梯度向的范围约束为0-180度,并且分割为9个方向,每个方向20度,再将约束后的角度除以20,则现在的梯度方向角度值就变为范围在[0,9)。
2.HOG特征提取具体实现方法是将图像分成小的连通区域,叫细胞单元(cell),将每个小Cell里面的梯度幅值按照9个方向进行统计,计算完之后,将会产生一个横坐标X为梯度方向,纵坐标Y为梯度幅值的方向梯度直方图。然后采集细胞单元中各像素点的梯度的或边缘的方向直方图,最后把这些直方图组合起来就可以构成特征描述器。把这些局部直方图在图像的更大的范围内(block)进行对比度归一化。 归一化是为了克服光照不均匀的变化以及前景和背景测对比差异。
大概步骤:
(1)灰度化。
(2)对输入图像进行颜色空间的标准化(归一化);调节图像的对比度,降低图像局部的阴影和光照变化所造成的影响,同时可以抑制噪音的干扰。
(3)计算图像每个像素的梯度(包括大小和方向);主要是为了捕获轮廓信息,同时进一步弱化光照的干扰。
(4)将图像划分成小cells(例如8*8像素/cell)。
(5)统计每个cell的梯度直方图(不同梯度的个数),即可形成每个cell的特性描述子。
(6)将每几个cell组成一个block(2X2个cell/block),一个block内所有cell的特性描述子串联起来便得到该block的HOG特性描述子。
(7)将图像内的所有block的HOG特征描述子串联起来就可以得到该图像的HOG特征描述子。这个就是最终的可供分类使用的特征向量了。
3.cell、block、windowsSize、stride的关系。
上图中单个cell的为8X8个像素,把cell对应的方向直方图转换为单维向量,按规定组距对对应方向梯度个数进行编码,得到单个cell的9个特征,每个block包含2X2个cell,那么每个block包含2X2个cell也就是2X2X9=36个特征,而每个block移动(stride)这里选择overlap,就是为2分之一重叠,一个64X128大小的图像横着有15个block,坚着有7个,最后得到的特征数为36X7X15=3780维。
5.代码实现
这时的代码环境是win7 64位,vs2015,opencv3.3。
(1)代码流程
(2)具体代码
头文件
#pragma once#include #include #include #include #include using namespace std;using namespace cv;class HogFeatureExtraction{public://构造函数HogFeatureExtraction();//构造函数HogFeatureExtraction(int _kwdbwbs, int _theta, int _cell_size, int _block_size, float _R);~HogFeatureExtraction();//计算积分图vector calculateIntegralHOG(Mat& srcMat);//单个cell的HOGvoid cacHOGinCell(Mat& m_HOGCell, Rect roi, vector& m_integrals);//单个block的HOGMat getBlockHog(cv::Point pt, std::vector& integrals);//整个图像的HOGMat cacHOGFeature(cv::Mat srcImage);private:int kwdbwbs;int theta;int cell_size;int block_size;float R;};
实现文件
#include \”HogFeatureExtraction.h\”HogFeatureExtraction::HogFeatureExtraction(){kwdbwbs = 9;theta = 180 / kwdbwbs;cell_size = 20;block_size = 2;R = cell_size*(block_size)*0.5;}HogFeatureExtraction::HogFeatureExtraction(int _kwdbwbs, int _theta, int _cell_size, int _block_size){kwdbwbs = _kwdbwbs;theta = 180 / kwdbwbs;block_size = _block_size;cell_size = _cell_size;R = _cell_size*(_block_size)*0.5;}HogFeatureExtraction::~HogFeatureExtraction(){}// 计算积分图vector HogFeatureExtraction::calculateIntegralHOG(Mat& m_src){Mat m_sobel_x,m_sobel_y,m_magn,m_angle;//x 方向上的差分阶数Sobel(m_src, m_sobel_x, CV_32F, 1, 0);//y 方向上的差分阶数Sobel(m_src, m_sobel_y, CV_32F, 0, 1);//根据每一个点X方向和Y方向上的梯度,实现笛卡尔坐标和极坐标的转换//得到梯度幅值和梯度方向cartToPolar(m_sobel_x, m_sobel_y, m_magn, m_angle, true);//将笛卡尔坐标转换为极坐标之后,角度的范围在[0,360],但要转成[0,180]//如果m_angle= 180);//将角度矩阵转换为一个灰度值范围在0~9之间的图像m_angle = m_angle /theta;//新建9个矩阵vector m_kwdbwbs(kwdbwbs);for (int i = 0; i
科技资讯SEO上一篇 : 阿彪神秘消失,究竟为何不再直播?
下一篇 : 思瑞为何突然停止直播?揭秘其背后原因
-
SEO外包最佳选择国内专业的白帽SEO机构,熟知搜索算法,各行业企业站优化策略!
SEO公司
-
可定制SEO优化套餐基于整站优化与品牌搜索展现,定制个性化营销推广方案!
SEO套餐
-
SEO入门教程多年积累SEO实战案例,从新手到专家,从入门到精通,海量的SEO学习资料!
SEO教程
-
SEO项目资源高质量SEO项目资源,稀缺性外链,优质文案代写,老域名提权,云主机相关配置折扣!
SEO资源
-
SEO快速建站快速搭建符合搜索引擎友好的企业网站,协助备案,域名选择,服务器配置等相关服务!
SEO建站
-
快速搜索引擎优化建议没有任何SEO机构,可以承诺搜索引擎排名的具体位置,如果有,那么请您多注意!专业的SEO机构,一般情况下只能确保目标关键词进入到首页或者前几页,如果您有相关问题,欢迎咨询!