Haar-like是一种非常经典的特征提取算法,尤其是它与AdaBoost组合使用时对人脸检测有着不错的效果,虽然只是在当时而言。OpenCV也对AdaBoost与Haar-like组成的级联人脸检测做了封装,所以一般提及Haar-like的时候,一般都会和AdaBoost,级联分类器,人脸检测,积分图等等一同出现。但是Haar-like本质上只是一种特征提取算法,下面我们只从特征提取的角度聊一聊Haar-like。它一共涉及到3篇经典的论文。
基本haar特征
最原始的Haar-like特征在2002年的《A general framework for object detection》提出,它定义了四个基本特征结构,如下A,B,C,D所示,可以将它们理解成为一个窗口,这个窗口将在图像中做步长为1的滑动,最终遍历整个图像。
比较特殊的一点是,当一次遍历结束后,窗口将在宽度或长度上成比例的放大,再重复之前遍历的步骤,直到放大到最后一个比例后结束。
那么可以放大的比例系数如何确定呢?设在宽度上可以放大的最大倍数为 Kw K w ,高度上可以放大的最大倍数为 Kh K h ,计算公式如下:
Kw=wIwwin K w = w I w w i n
Kh=hIhwin K h = h I h w i n
其中
wI w I 和
hI h I 是整个图像的宽高,
wwin w w i n 和
hwin h w i n 是haar窗口的初始宽高,可以放大的倍数为
Kw⋅Kh K w ⋅ K h 。
Haar-like特征提取过程就是利用上面定义的窗口在图像中滑动,滑动到一个位置的时候,将窗口覆盖住的区域中的白色位置对应的像素值的和减去黑色位置对应的像素值的和,得到的一个数值就是haar特征中一个维度。
其中对于窗口C,黑色区域的像素值加和要乘以2,2是为了像素点个数相同而增加的权重。
扩展haar特征
在基本的四个haar特征基础上,文章《An extended set of Haar-like features for rapid object detection》对其做了扩展,将原来的4个扩展为14个。这些扩展特征主要增加了旋转性,能够提取到更丰富的边缘信息。
积分图计算
Haar的第三个经常提及的概念,就是积分图了,首先积分图这个东西和Haar一点关系都没有,它们是两个独立的概念。
之所以积分图与Haar联系到一起是因为一篇文章《Rapid object detection using a boosted cascade of simple features》,它使用积分图的方法快速计算Haar特征。下面我们先看一下什么时候积分图:
积分图是(Integral Image)类似动态规划的方法,主要的思想是将图像从起点开始到各个点所形成的矩形区域像素之存在数组中,当要计算某个区域的像素和时可以直接从数组中索引,不需要重新计算这个区域的像素和,从而加快了计算。
上面这幅图中有四个区域,A,B,C,D。我们将左上角的点记为0,区域 A A 的所有点像素值的和记为 sumA s u m A ,点0与点1之间的积分图记为 integral0,1 i n t e g r a l 0 , 1 那么根据积分图的定义:
sumA=integral0,1 s u m A = i n t e g r a l 0 , 1
sumA+B+C+D=integral0,4 s u m A + B + C + D = i n t e g r a l 0 , 4
区域D的像素值和
sumD s u m D 就应该为
integral1,4 i n t e g r a l 1 , 4 ,但是注意,自积分图中是没有从点1到点4的概念的,它所有的起点都应该是点0,所以:
sumD=integral1,4=integral0,4−integral0,2−integral0,3+integral0,1 s u m D = i n t e g r a l 1 , 4 = i n t e g r a l 0 , 4 − i n t e g r a l 0 , 2 − i n t e g r a l 0 , 3 + i n t e g r a l 0 , 1
转化一下就是
sumD=sumA+B+C+D−sumA+B−sumA+C+sumA s u m D = s u m A + B + C + D − s u m A + B − s u m A + C + s u m A
上面的内容就是积分图,比如说我们要求
sumD s u m D ,并不需要从点1到点4做行列的遍历,因为这个遍历过程的时间复杂度是O(mn)的。我们只需要先存在下来从0到点1,2,3,4的积分图,然后做一个简单的加减法就好了,这个时间复杂度仅仅为O(1)。当然了,存储的过程是消耗空间复杂度的,这是很典型的空间换时间的套路。这就是上面提到的积分图加速计算的过程,那么它和Haar有啥关系呢?
我们注意到,积分图是在计算一个区域内所有点的像素值的和,Harr的特征提取过程也是这样啊,它们本质上在做一个东西而已,积分图那套东西,搬到Haar特征计算上完全不需要一点改的啊。
比如上面这样图所示的Haar窗口,滑动到了当前位置,我们要计算此时的Haar特征,它是区域A+C的像素值的和减去区域B的:
Harrv1=sumA+C−sumB H a r r v 1 = s u m A + C − s u m B
sumA+C=sumA+sumC=integral0,1+integral0,3−integral0,2 s u m A + C = s u m A + s u m C = i n t e g r a l 0 , 1 + i n t e g r a l 0 , 3 − i n t e g r a l 0 , 2
sumB=integral0,2−integral0,1 s u m B = i n t e g r a l 0 , 2 − i n t e g r a l 0 , 1
于是,就计算出了当前的Haar特征。
维度计算
我们知道了Harr特征的计算过程,它的维度就很好计算出来了。
Haar的总维度应该是每一种窗口产生的维度的和;
而每一种窗口产生的维度又是它遍历所有比例之后的维度和;
一个窗口固定一个比例时的维度就是滑动遍历整个图像所产生的维度和。
【图像处理】计算Haar特征个数这篇博客中给出了详细的计算过程,在这里就不做重复了。