Haar-like矩形特征的特征值的快速计算方法
FROM: http://blog.sina.com.cn/s/blog_4e6680090100d2sd.html
1、Haar-like特征:
Haar-like特征最早是由Papageorgiou等应用于人脸表示。Papageorgiou在针对正面人脸和人体检测问题的研究中使用Haar小波基函数,他们发现标准正交Haar小波基在应用上受到一定的限制,为了取得更好的空间分辨率,他们使用了3种类型的3种形式的特征。Viola等在此基础上作了扩展,使用2种类型4种形式的特征。3种类型分别为:2-矩形特征、3-矩形特征、4-矩形特征。
对于图中的A, B和D这类特征,特征数值计算公式为:
v=Sum白-Sum黑
而对于C来说,计算公式如下:
v=Sum白-2*Sum黑
之所以将黑色区域像素和乘以2 ,是为了使两种矩形区域中像素数目一致。
通过改变特征模板的大小和位置,可在图像子窗口中穷举出大量的特征。为了描述的方便,本文将上图的特征模板称为“特征原型”;特征原型在图像子窗口中扩展 (平移伸缩)得到的特征称为“矩形特征”;矩形特征的称为 “特征值”o
假设训练或检测窗口大小为Wx H个像素,w , h 分别为特征原型的长、 宽,所示四种特征原型对应的w / h 分别为:2/1,1/2,3/1,2/2。
一个haar-like特征在24*24像素图的子检测窗口中的矩形特征数量总计为134736个。
2、积分图:
由于训练样本通常有近万个,并且矩形特征的数量非常庞大,如果每次计算特征值都要统计矩形内所以像素之和,将会大大降低训练和检测的速度。因此引入了一种新的图像表示方法——积分图像,矩形特征的特征值计算,只与此特征矩形的端点的积分图有关,所以不管此特征矩形的尺度变换如何,特征值的计算所消耗的时间都是常量。这样只要遍历图像一次,就可以求得所有子窗口的特征值。
积分图的定义为:
其中I(x',y')为图像在点(x',y')处的像素值。
为了节约时间,减少重复计算,则图像I的积分图可按如下递推公式计算:
这样就可以进行2种运算:
(1)任意矩形区域内像素积分。由图像的积分图可方便快速地计算图像中任意矩形内所有像素灰度积分。如下图2.3所示,点1的积分图像ii1的值为(其中Sum为求和) :
ii1=Sum(A)
同理,点2、点3、点4的积分图像分别为:
ii2=Sum(A)+Sum(B); ii3=Sum(A)+Sum(C); ii4=Sum(A)+Sum(B)+Sum(C)+Sum(D);
矩形区域D内的所有像素灰度积分可由矩形端点的积分图像值得到:
Sum(D)=ii1+ii4-(ii2+ii3) (1)
(2) 特征值计算
矩形特征的特征值是两个不同的矩形区域像素和之差,由(1)式可以计算任意矩形特征的特征值,下面以图2.1中特征原型A为例说明特征值的计算。
如图2.4 所示,该特征原型的特征值定义为:
Sum(A)-Sum(B)
根据(1)式则有:Sum(A)=ii4+ii1-(ii2+ii3); Sum(B)=ii6+ii3-(ii4+ii5);
所以此类特征原型的特征值为:
(ii4-ii3)-(ii2-ii1)+(ii4-ii3)-(ii6-ii5)
另示:运用积分图可以快速计算给定的矩形之所有象素值之和Sum(r)。假设r=(x,y,w,h),那么此矩形内部所有元素之和等价于下面积分图中下面这个式子:
Sum(r) = ii(x+w,y+h)+ii(x-1,y-1)-ii(x+w,y-1)-ii(x-1,y+h)
由此可见,矩形特征特征值计算只与此特征端点的积分图有关,而与图像坐标值无关。对于同一类型的矩形特征,不管特征的尺度和位置如何,特征值的计算所耗费的时间都是常量,而且都只是简单的加减运算。其它类型的特征值计算方法类似。
[matlab code]
%---------------------------------------------------------------------------------------------
%2 遍历得到各点的积分
function ii = bianli(I)
[row,col] = size(I);
ii=zeros(row,col);
for i=1:row
for j=1:col
s=sum(I(1:i,j));
if(j-1<=0)
ii(i,j) = s;
else
ii(i,j)=s+ii(i,j-1);
end
s=0;
end
end
%---------------------------------------------------------------------------------------------
%3 在矩阵上面补0和左面补0
%rn 补rn行0
%cn 补cn列0
function ii = buzero(iio,rn,cn)
[row,col]=size(iio);
ii=[zeros(rn,col+cn);[zeros(row,cn),iio]];
%---------------------------------------------------------------------------------------------
%对于图中B的矩阵特征
function F = tezhen1(ii)
minw = 1; %最小宽
minh = 2; %最小高
aw=1; %伸缩倍率,w方向
ah=1; %伸缩倍率,h方向
F=[];
F1=[];
w=minw;
h=minh;
[row,col]=size(ii);
while(minh*ah<=row)
while(minw*aw<=col)
for i=1:row-h
for j=1:col-w
white = ii(i,j)+ii(i+h/2,j+w)-ii(i+h/2,j)-ii(i,j+w);
black = ii(i+h/2,j)+ii(i+h,j+w)-ii(i+h,j)-ii(i+h/2,j+w);