本文主要是介绍Hog特征、Haar特征,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
HOG:
http://blog.csdn.net/abcjennifer/article/details/7365651(转载)
HOG即histogram of oriented gradient, 是用于目标检测的特征描述子,该技术将图像局部出现的方向梯度次数进行计数,该方法和边缘方向直方图、scale-invariant feature transform类似,不同的是hog的计算基于一致空间的密度矩阵来提高准确率。Navneet Dalal and Bill Triggs首先在05年的CVPR中提出HOG,用于静态图像or视频的行人检测。
HOG特征原理:
HOG的核心思想是所检测的局部物体外形能够被光强梯度或边缘方向的分布所描述。通过将整幅图像分割成小的连接区域(称为cells),每个cell生成一个方向梯度直方图或者cell中pixel的边缘方向,这些直方图的组合可表示出(所检测目标的目标)描述子。为改善准确率,局部直方图可以通过计算图像中一个较大区域(称为block)的光强作为measure被对比标准化,然后用这个值(measure)归一化这个block中的所有cells.这个归一化过程完成了更好的照射/阴影不变性。
与其他描述子相比,HOG得到的描述子保持了几何和光学转化不变性(除非物体方向改变)。因此HOG描述子尤其适合人的检测。
通俗的讲:
HOG特征提取方法就是将一个image:
1. 灰度化(将图像看做一个x,y,z(灰度)的三维图像)
2. 划分成小cells(2*2)
3. 计算每个cell中每个pixel的gradient(即orientation)
4. 统计每个cell的梯度直方图(不同梯度的个数),即可形成每个cell的descriptor
使用HOG训练样本方法步骤:http://blog.csdn.net/t1234xy4/article/details/51543452
1、HOG特征:http://www.open-open.com/lib/view/open1440832074794.html(转载)
(1)主要思想:
在一副图像中,局部目标的表象和形状(appearance and shape)能够被梯度或边缘的方向密度分布很好地描述。(本质:梯度的统计信息,而梯度主要存在于边缘的地方)。
(2)具体的实现方法是:
首先将图像分成小的连通区域,我们把它叫细胞单元。然后采集细胞单元中各像素点的梯度的或边缘的方向直方图。最后把这些直方图组合起来就可以构成特征描述器。
(3)提高性能:
把这些局部直方图在图像的更大的范围内(我们把它叫区间或block)进行对比度归一化(contrast-normalized),所采用的方 法是:先计算各直方图在这个区间(block)中的密度,然后根据这个密度对区间中的各个细胞单元做归一化。通过这个归一化后,能对光照变化和阴影获得更 好的效果。
(4)优点:
与其他的特征描述方法相比,HOG有很多优点。首先,由于HOG是在图像的局部方格单元上操作,所以它对图像几何的和光学的形变都能保持很好的不 变性,这两种形变只会出现在更大的空间领域上。其次,在粗的空域抽样、精细的方向抽样以及较强的局部光学归一化等条件下,只要行人大体上能够保持直立的姿 势,可以容许行人有一些细微的肢体动作,这些细微的动作可以被忽略而不影响检测效果。因此HOG特征是特别适合于做图像中的人体检测的。
2、HOG特征提取算法的实现过程:
大概过程:
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了。这个就是最终的可供分类使用的特征向量了。
Haar特征:
(1)Haar特征:
Haar特征分为三类:边缘特征、线性特征、中心特征和对角线特征,组合成特征模板。特征模板内有白色和黑色两种矩形,并定义该模板的特征值为白色矩形像素和减去黑色矩形像素和。
1、Haar-like特征 http://www.open-open.com/lib/view/open1440832074794.html(转载)
Haar-like特征最早是由Papageorgiou等应用于人脸表示,Viola和Jones在此基础上,使用3种类型4种形式的特征。
Haar特征分为三类:边缘特征、线性特征、中心特征和对角线特征,组合成特征模板。特征模板内有白色和黑色两种矩形,并定义该模板的特征值为白 色矩形像素和减去黑色矩形像素和。Haar特征值反映了图像的灰度变化情况。例如:脸部的一些特征能由矩形特征简单的描述,如:眼睛要比脸颊颜色要深,鼻 梁两侧比鼻梁颜色要深,嘴巴比周围颜色要深等。但矩形特征只对一些简单的图形结构,如边缘、线段较敏感,所以只能描述特定走向(水平、垂直、对角)的结 构。
对于图中的A, B和D这类特征,特征数值计算公式为:v=Sum白-Sum黑,而对于C来说,计算公式如下:v=Sum白-2*Sum黑;之所以将黑色区域像素和乘以2,是为了使两种矩形区域中像素数目一致。
通过改变特征模板的大小和位置,可在图像子窗口中穷举出大量的特征。上图的特征模板称为“特征原型”;特征原型在图像子窗口中扩展(平移伸缩)得到的特征称为“矩形特征”;矩形特征的值称为“特征值”。
应用:http://blog.csdn.net/sunboyiris/article/details/38168111
haar特征检测流程 http://blog.csdn.net/nongfu_spring/article/details/38977555
下面为HAAR特征检测的具体流程:
一.在计算每个窗口的haar值时,使用CvHidHaarClassifierCascade结构的casecade,因此需要以下步骤。
1. 创建CvHidHaarClassifierCascade结构对应的casecade。
即申请内存,并填写casecade中相关的头信息,如有多少个stage,每个stage下有多少个tree,每个tree下有多少个node,以及相关的阈值等信息。
2. 填写每个haar feature对应的积分图中矩形框的指针。
包括casecade指向的积分图的指针sum,更多的是相应haar特征对应的矩形框指针以及权重。每个haar特征对应着2个或者3个带权重的矩形框,分别用p0,p1,p2,p3指向每个矩形框的四个顶点在积分图中的相应位置。
另外,这里haar特征对应的矩形框是根据窗口大小变化的。如样本是20*20,某个haar特征对应的某一个矩形框是4*4,当scanWindow的窗口放大为40*40时,该矩形框也扩大为8*8。
所有的矩形框顶点的指针都是基于原图的积分图的,当窗口缩放时,其haar特征对应的矩形框的顶点位置也会发生相应的缩放。
二.有了CvHidHaarClassifierCascade结构的casecade,就可以计算每个window对应的stage值了。实际上,在每一个window尺寸上创建好casecade后,就会计算该window大小下所有窗口的stage值,保存满足条件的那些窗口。然后再创建下一个缩放window尺寸上的casecade,并替换掉上一个尺寸的casecade,再计算新window大小下所有窗口的stage值,继续保存满足条件的那些窗口。如此循环,直至缩放的窗口小于样本的尺寸,或者缩放的窗口大于原图的尺寸。其中计算每个固定尺寸窗口的stage值的过程见三中详述。
三.计算每一个window尺寸上所有窗口的stage值。将满足条件的窗口保存下来。这个过程用cvRunHaarClassifierCascadeSum函数判断,当cvRunHaarClassifierCascadeSum返回值大于0,才会保存此时检测的窗口位置,作为备选,参与后面的聚类过程。
1. static int cvRunHaarClassifierCascadeSum ( const CvHaarClassifierCascade* _cascade,CvPoint pt, int start_stage )
其中入参cascade为分类器,pt为检测窗口的左上角的坐标。其中窗口大小已经在外层保存了。start_stage为计算串口haar值的起始stage,若为0,则所有的stage都参与计算。
该函数计算指定窗口中分类器对应的haar值,并根据分类器的结果判定是否满足要求。满足返回1,不满足返回0。
2. cvRunHaarClassifierCascadeSum函数调用icvEvalHidHaarClassifier来计算出每个树对应节点的haar特征值,然后再和该节点的阈值比较,如果小于阈值,就进去左边分支;如果大于阈值,就进入右边分支;直至分支的索引小于等于0,此时得到的alpha为该树的计算结果。
icvEvalHidHaarClassifier函数在计算指定窗口中分类器对应的haar值,使用了积分图。即使用该windown尺寸下casecade中所有haar特征的p0,p1,p2,p3。每移动一次窗口,p0,p1,p2,p3指针移动相应的位置,再计算(*p0+*p3-*p1-*p2),其值为图像中矩形框位置的灰度和。将其乘以相应的权重,即可得到haar特征值。下面为相应的代码:
do
{
CvHidHaarTreeNode* node = classifier->node + idx;
double t = node->threshold * variance_norm_factor;
double sum = calc_sum(node->feature.rect[0],p_offset) * node->feature.rect[0].weight;
sum += calc_sum(node->feature.rect[1],p_offset) * node->feature.rect[1].weight;
if( node->feature.rect[2].p0 )
sum += calc_sum(node->feature.rect[2],p_offset) * node->feature.rect[2].weight;
idx = sum < t ? node->left : node->right;
}
while( idx > 0 );
3. 当用icvEvalHidHaarClassifier计算所有树的节点后,再判断所有树的累积和(所有树的alpha之和)是否大于stage阈值,如果大于阈值则返回1,否则返回负值。返回1,则再进行下一个stage计算,直至所有的stage计算完毕,并且每个累积和都大于每个stage相应的阈值,则cvRunHaarClassifierCascadeSum返回1。
这时一个窗口计算完毕,保存此时检测的窗口位置,作为备选,参与后面的聚类过程。
然后平移窗口,重复上述,2,3的步骤,直至窗口移动到图像的右下边界。
四.当所有满足尺寸要求的窗口遍历完毕,并将满足条件的窗口保存完毕后,再对保存的窗口进行聚类,和最小邻域过滤。
这篇关于Hog特征、Haar特征的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!