转载博客:http://blog.csdn.net/zy1034092330/article/details/48850437
1、Haar-like特征
Haar特征最先由Paul Viola等人提出,后经过Rainer Lienhart等扩展引入45°倾斜特征。Haar特征分为三类:边缘特征、线性特征、中心特征和对角线特征,组合成特征模板。OpenCV(2.4.11版本)所使用的共计14种Haar特征,包括5种Basic特征、3种Core特征和6种Titled(即45°旋转)特征。
在使用opencv自带的训练工具进行训练时,haarFeatureParams参数中的mode参数正对应了训练过程中所使用的特征集合。
1. 如果mode为BASIC,则只使用BASIC的5种Haar特征进行训练,训练出的分类器也只包含这5种特征。
2. 如果mode为CORE,则使用BASIC的5种+CORE的3种Haar特征进行训练。
3. 如果mode为ALL,则使用BASICA的5种+CORE的3种+ALL的6种Titled共14种特征进行训练。
默认使用BASIC模式,实际中训练和检测效果已经足够好。不建议使用ALL参数,引入Titled倾斜特征需要多计算一张倾斜积分图,会极大的降低训练和检测速度。
2、矩形特征模板的计算
haar特征模板内有白色和黑色两种矩形,Haar特征值=整个Haar区域内像素和×权重 + 黑色区域内像素和×权重:
- 对于图2中的x3和y3特征,weightall = 1,weightblack = -3;
- 对于point特征,weightall = 1,weightblack = -9;
- 其余11种特征均为weightall =1, weightblack = -2。
即“白色区域像素和减去黑色区域像素和”,只不过是加权相加而已。
例如以x2特征为例,(黑 + 白) * 1 + 黑 * (-2) = 白 - 黑;
对于Point特征,(黑 + 白) * 1 + 黑 * (-9) = 白 - 8 * 黑。
设置权值就是为了抵消面积不等带来的影响,保证所有Haar特征的特征值在灰度分布绝对均匀的图中为0。
Haar特征值反映了图像的灰度变化情况。例如:脸部的一些特征能由矩形特征简单的描述,如:眼睛要比脸颊颜色要深,鼻梁两侧比鼻梁颜色要深,嘴巴比周围颜色要深等。但矩形特征只对一些简单的图形结构,如边缘、线段较敏感,所以只能描述特定走向(水平、垂直、对角)的结构。
3、haar特征的子特征生成
Haar特征矩形特征可位于图像任意位置,大小也可以任意改变,所以矩形特征值是矩形模版类别、矩形位置和矩形大小这三个因素的函数。故类别、大小和位置的变化,使得很小的检测窗口含有非常多的矩形特征,如:在24*24像素大小的检测窗口内矩形特征数量可以达到16万个。白:黑区域面积比始终保持不变
以x3特征为例,在放大+平移过程中白:黑:白面积比始终是1:1:1。首先在红框所示的检测窗口中生成大小为3个像素的最小x3特征;之后分别沿着x和y平移产生了在检测窗口中不同位置的大量最小3像素x3特征;然后把最小x3特征分别沿着x和y放大,再平移,又产生了一系列大一点x3特征;然后继续放大+平移,重复此过程,直到放大后的x3和检测窗口一样大。这样x3就产生了完整的x3系列特征。
那么这些通过放大+平移的获得的子特征到底总共有多少个?
假设检测窗口大小为W*H,矩形特征大小为w*h,X和Y为表示矩形特征在水平和垂直方向的能放大的最大比例系数:
则总共可以获得的子特征数目为:
公式解释:
1. 特征框竖直放大1倍,即无放大,竖直方向有(H-h+1)个特征
2. 特征框竖直放大2倍,竖直方向有(H-2h+1)个特征
3. 特征框竖直放大3倍,竖直方向有(H-3h+1)个特征
4.如此到竖直放大Y=floor(H/h)倍,竖直方向有1个特征,即(H-Y*h+1)
那么竖直方向总共有(H-h+1)+(H-2h+1)+(H-3h+1)+……+(H-Y*h+1)=Y[H+1-h(1+Y)/2]个特征。
5.同理,在水平方向共有(W-w+1)+(W-2w+1)+(W-3w+1)+……+(W-X*w+1)=X[W+1-w(1+X)/2]。
6.由于水平方向和垂直方向相互独立,所以子特征数目为:子特征数目 = 水平方向数目X垂直方向数目
一般而言,haar特征值计算出来的值跨度很大,所以在实际的特征提取中时,一般会对haar特征再进行标准化,压缩特征值范围。
4、Haar-like特征的计算-积分图
目标:如何快速计算Haar特征值
手段:积分图。积分图就是只遍历一次图像就可以求出图像中所有区域像素和的快速算法,大大的提高了图像特征值计算的效率。
积分图主要的思想:将图像从起点开始到各个点所形成的矩形区域像素之和作为一个数组的元素保存在内存中,当要计算某个区域的像素和时可以直接索引数组的元素,不用重新计算这个区域的像素和,从而加快了计算(这有个相应的称呼,叫做动态规划算法)。积分图能够在多种尺度下,使用相同的时间(常数时间)来计算不同的特征,因此大大提高了检测速度。
我们来看看它是怎么做到的。
积分图是一种能够描述全局信息的矩阵表示方法。积分图的构造方式是位置(i,j)处的值ii(i,j)是原图像(i,j)左上角方向所有像素的和:
积分图构建算法:
1)用s(i,j)表示行方向的累加和,初始化s(i,-1)=0;
2)用ii(i,j)表示一个积分图像,初始化ii(-1,i)=0;
3)逐行扫描图像,递归计算每个像素(i,j)行方向的累加和s(i,j)和积分图像ii(i,j)的值
s(i,j)=s(i,j-1)+f(i,j)
ii(i,j)=ii(i-1,j)+s(i,j)
4)扫描图像一遍,当到达图像右下角像素时,积分图像ii就构造好了。
积分图构造好之后,图像中任何矩阵区域的像素累加和都可以通过简单运算得到如图所示。
设D的四个顶点分别为1、2、3、4,则D的像素和可以表示为
Dsum = ii( 1 )+ii( 4)-(ii(2)+ii(3 ));
而Haar-like特征值无非就是两个矩阵像素和的差,同样可以在常数时间内完成。所以矩形特征的特征值计算,只与此特征矩形的端点的积分图有关,所以不管此特征矩形的尺度变换如何,特征值的计算所消耗的时间都是常量。这样只要遍历图像一次,就可以求得所有子窗口的特征值。
在实际中,如果使用旋转特征,则需要多计算一张积分图。但是旋转特征的效果往往不理想,得不偿失,不建议使用。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:目标检测算法-特征提取之Haar特征 - Python技术站