1. 程式人生 > >關於人臉檢測中的Haar特徵提取

關於人臉檢測中的Haar特徵提取

1、Haar-like特徵:

    Haar-like特徵最早是由Papageorgiou等應用於人臉表示。Papageorgiou在針對正面人臉和人體檢測問題的研究中使用Haar小波基函式,他們發現標準正交Haar小波基在應用上受到一定的限制,為了取得更好的空間解析度,他們使用了3種類型的3種形式的特徵。Viola等在此基礎上作了擴充套件,使用2種類型4種形式的特徵。3種類型分別為:2-矩形特徵、3-矩形特徵、4-矩形特徵。

    [轉載]Haar-like矩形特徵的特徵值的快速計算方法

    對於圖中的A,  B和D這類特徵,特徵數值計算公式為:

                                v=Sum白-Sum黑

    而對於C來說,計算公式如下:

               v=Sum白-2*Sum黑

   之所以將黑色區域畫素和乘以2 ,是為了使兩種矩形區域中畫素數目一致。

    通過改變特徵模板的大小和位置,可在影象子視窗中窮舉出大量的特徵。為了描述的方便,本文將上圖的特徵模板稱為“特徵原型”;特徵原型在影象子視窗中擴充套件 (平移伸縮)得到的特徵稱為“矩形特徵”;矩形特徵的稱為 “特徵值”o

     假設訓練或檢測視窗大小為Wx H個畫素,w , h 分別為特徵原型的長、 寬,所示四種特徵原型對應的w 1 h 分別為:2/1,1/2,3/1,2/2。

    [轉載]Haar-like矩形特徵的特徵值的快速計算方法

    一個haar-like特徵在24*24畫素圖的子檢測視窗中的矩形特徵數量總計為134736個。

   2、積分圖:

    由於訓練樣本通常有近萬個,並且矩形特徵的數量非常龐大,如果每次計算特徵值都要統計矩形內所以畫素之和,將會大大降低訓練和檢測的速度。因此引入了一種新的影象表示方法——積分影象,矩形特徵的特徵值計算,只與此特徵矩形的端點的積分圖有關,所以不管此特徵矩形的尺度變換如何,特徵值的計算所消耗的時間都是常量。這樣只要遍歷影象一次,就可以求得所有子視窗的特徵值。

    積分圖的定義為:

    [轉載]Haar-like矩形特徵的特徵值的快速計算方法
    其中I(x',y')為影象在點(x',y')處的畫素值。

    為了節約時間,減少重複計算,則影象I的積分圖可按如下遞推公式計算:

    [轉載]Haar-like矩形特徵的特徵值的快速計算方法
    這樣就可以進行2種運算:

    (1)任意矩形區域內畫素積分。由影象的積分圖可方便快速地計算影象中任意矩形內所有畫素灰度積分。如下圖2.3所示,點1的積分影象ii1的值為(其中Sum為求和) :

    ii1=Sum(A)

    [轉載]Haar-like矩形特徵的特徵值的快速計算方法

    同理,點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為例說明特徵值的計算。

    [轉載]Haar-like矩形特徵的特徵值的快速計算方法
    如圖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);