Kh=hIhwin
K
h
=
h
I
h
w
i
n
K_{h}=\frac{h_{I}}{h_{win}}
其中
wI
w
I
w_{I}和
hI
h
I
h_{I}是整个图像的宽高,
wwin
w
w
i
n
w_{win}和
hwin
h
w
i
n
h_{win}是haar窗口的初始宽高,可以放大的倍数为
Kw⋅Kh
K
w
⋅
K
h
K_{w}\cdot 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
A的所有点像素值的和记为sumAsumAsum_{A},点0与点1之间的积分图记为
integral0,1
i
n
t
e
g
r
a
l
0
,
1
integral_{0,1}那么根据积分图的定义:
sumA=integral0,1
s
u
m
A
=
i
n
t
e
g
r
a
l
0
,
1
sum_{A}=integral_{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
sum_{A+B+C+D}=integral_{0,4}
区域D的像素值和
sumD
s
u
m
D
sum_{D}就应该为
integral1,4
i
n
t
e
g
r
a
l
1
,
4
integral_{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
sum_{D}=integral_{1,4}=integral_{0,4}-integral_{0,2}-integral_{0,3}+integral_{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
sum_{D}=sum_{A+B+C+D}-sum_{A+B}-sum_{A+C}+sum_{A}
上面的内容就是积分图,比如说我们要求
sumD
s
u
m
D
sum_{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
Harr_{v1}=sum_{A+C}-sum_{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