1. 程式人生 > >python進階之目標檢測的影象特徵提取之Haar特徵

python進階之目標檢測的影象特徵提取之Haar特徵

目標檢測的影象特徵提取之(三)Haar特徵

1Haar-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

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

3Haar-like矩形特徵拓展

         Lienhart R.等對Haar-like矩形特徵庫作了進一步擴充套件,加入了旋轉45角的矩形特徵。擴充套件後的特徵大致分為4種類型:邊緣特徵、線特徵環、中心環繞特徵和對角線特徵:

       在特徵值的計算過程中,黑色區域的權值為負值,白色區域的權值為正值。而且權值與矩形面積成反比(使兩種矩形區域中畫素數目一致);

豎直矩陣特徵值計算:

     對於豎直矩陣,與上面2處說的一樣。

45°旋角的矩形特徵計算:

      對於45°旋角的矩形,我們定義RSAT(x,y)為點(x,y)左上角45°區域和左下角45°區域的畫素和。

       

用公式可以表示為:

為了節約時間,減少重複計算,可按如下遞推公式計算:

而計算矩陣特徵的特徵值,是位於十字行矩形RSAT(x,y)之差。可參考下圖:

轉載自:http://blog.csdn.net/zouxy09/article/details/7929570