Harr-like feature-Harr-like特徵詳解

1. Haar-like特徵,即很多人常說的Haar特徵,是計算機視覺領域一種常用的特徵描述算子。它最早是由Papageorigiou等人用於人臉描述。目前常用的Haar-like特徵可以分爲三類:線性特徵、邊緣特徵、點特徵(中心特徵)、對角線特徵。如下圖所示:


顯然,邊緣特徵有4種:x方向,y方向,x傾斜方向,y傾斜方向;線特徵有8種,點特徵有2種,對角線特徵有1種。每一種特徵的計算都是由黑色填充區域的像素值之和與白色填充區域的像素值之和的差值。而計算出來的這個差值就是所謂的Haar-like特徵的特徵值。

2. Haar-like特徵

       Haar-like特徵最早是由Papageorgiou等應用於人臉表示,ViolaJones在此基礎上,使用3種類型4種形式的特徵。

Haar特徵分爲三類:邊緣特徵、線性特徵、中心特徵和對角線特徵,組合成特徵模板。特徵模板內有白色和黑色兩種矩形,並定義該模板的特徵值爲白色矩形像素和減去黑色矩形像素和。Haar特徵值反映了圖像的灰度變化情況。例如:臉部的一些特徵能由矩形特徵簡單的描述,如:眼睛要比臉頰顏色要深,鼻樑兩側比鼻樑顏色要深,嘴巴比周圍顏色要深等。但矩形特徵只對一些簡單的圖形結構,如邊緣、線段較敏感,所以只能描述特定走向(水平、垂直、對角)的結構。

     對於圖中的A, BD這類特徵,特徵數值計算公式爲:v=Sum-Sum黑,而對於C來說,計算公式如下:v=Sum-2*Sum黑;之所以將黑色區域像素和乘以2,是爲了使兩種矩形區域中像素數目一致。

     通過改變特徵模板的大小和位置,可在圖像子窗口中窮舉出大量的特徵。上圖的特徵模板稱爲“特徵原型”;特徵原型在圖像子窗口中擴展(平移伸縮)得到的特徵稱爲“矩形特徵”;矩形特徵的值稱爲“特徵值”。

      矩形特徵可位於圖像任意位置,大小也可以任意改變,所以矩形特徵值是矩形模版類別、矩形位置和矩形大小這三個因素的函數。故類別、大小和位置的變化,使得很小的檢測窗口含有非常多的矩形特徵,如:在24*24像素大小的檢測窗口內矩形特徵數量可以達到16萬個。這樣就有兩個問題需要解決了:(1)如何快速計算那麼多的特徵?---積分圖大顯神通;(2)哪些矩形特徵纔是對分類器分類最有效的?---如通過AdaBoost算法來訓練(這一塊這裏不討論,具體見http://blog.csdn.net/zouxy09/article/details/7922923

3. Haar-like特徵的計算積分圖

       積分圖就是隻遍歷一次圖像就可以求出圖像中所有區域像素和的快速算法,大大的提高了圖像特徵值計算的效率。

       積分圖主要的思想是將圖像從起點開始到各個點所形成的矩形區域像素之和作爲一個數組的元素保存在內存中,當要計算某個區域的像素和時可以直接索引數組的元素,不用重新計算這個區域的像素和,從而加快了計算(這有個相應的稱呼,叫做動態規劃算法)。積分圖能夠在多種尺度下,使用相同的時間(常數時間)來計算不同的特徵,因此大大提高了檢測速度。

       我們來看看它是怎麼做到的。

       積分圖是一種能夠描述全局信息的矩陣表示方法。積分圖的構造方式是位置(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的四個頂點分別爲α、β、γ、δ,則D的像素和可以表示爲

Dsum = ii( α )+ii( β)-(ii( γ)+ii( δ ));

        而Haar-like特徵值無非就是兩個矩陣像素和的差,同樣可以在常數時間內完成。所以矩形特徵的特徵值計算,只與此特徵矩形的端點的積分圖有關,所以不管此特徵矩形的尺度變換如何,特徵值的計算所消耗的時間都是常量。這樣只要遍歷圖像一次,就可以求得所有子窗口的特徵值。

另一種講解:

積分圖:

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

    積分圖的定義爲:

    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)

    由此可見,矩形特徵特徵值計算只與此特徵端點的積分圖有關,而與圖像座標值無關。對於同一類型的矩形特徵,不管特徵的尺度和位置如何,特徵值的計算所耗費的時間都是常量,而且都只是簡單的加減運算。其它類型的特徵值計算方法類似。

 

%---------------------------------------------------------------------------------------------
%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);
         
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章