【轉】haar特徵簡單分析

目標檢測的圖像特徵提取之(一)Haar特徵 
轉載博客:http://blog.csdn.net/zy1034092330/article/details/48850437

1、Haar-like特徵 
Haar特徵最先由Paul Viola等人提出,後經過Rainer Lienhart等擴展引入45°傾斜特徵。Haar特徵分爲三類:邊緣特徵、線性特徵、中心特徵和對角線特徵,組合成特徵模板。OpenCV(2.4.11版本)所使用的共計14種Haar特徵,包括5種Basic特徵、3種Core特徵和6種Titled(即45°旋轉)特徵。 
這裏寫圖片描述 
在使用opencv自帶的訓練工具進行訓練時,haarFeatureParams參數中的mode參數正對應了訓練過程中所使用的特徵集合。 
1. 如果mode爲BASIC,則只使用BASIC的5種Haar特徵進行訓練,訓練出的分類器也只包含這5種特徵。 
2. 如果mode爲CORE,則使用BASIC的5種+CORE的3種Haar特徵進行訓練。 
3. 如果mode爲ALL,則使用BASICA的5種+CORE的3種+ALL的6種Titled共14種特徵進行訓練。 
默認使用BASIC模式,實際中訓練和檢測效果已經足夠好。不建議使用ALL參數,引入Titled傾斜特徵需要多計算一張傾斜積分圖,會極大的降低訓練和檢測速度。

2、矩形特徵模板的計算 
haar特徵模板內有白色和黑色兩種矩形,Haar特徵值=整個Haar區域內像素和×權重 + 黑色區域內像素和×權重: 
這裏寫圖片描述

  1. 對於圖2中的x3和y3特徵,weightall = 1,weightblack = -3;
  2. 對於point特徵,weightall = 1,weightblack = -9;
  3. 其餘11種特徵均爲weightall =1, weightblack = -2。 
    即“白色區域像素和減去黑色區域像素和”,只不過是加權相加而已。 
    例如以x2特徵爲例,(黑 + 白) * 1 + 黑 * (-2) = 白 - 黑; 
    對於Point特徵,(黑 + 白) * 1 + 黑 * (-9) = 白 - 8 * 黑。

設置權值就是爲了抵消面積不等帶來的影響,保證所有Haar特徵的特徵值在灰度分佈絕對均勻的圖中爲0。 
Haar特徵值反映了圖像的灰度變化情況。例如:臉部的一些特徵能由矩形特徵簡單的描述,如:眼睛要比臉頰顏色要深,鼻樑兩側比鼻樑顏色要深,嘴巴比周圍顏色要深等。但矩形特徵只對一些簡單的圖形結構,如邊緣、線段較敏感,所以只能描述特定走向(水平、垂直、對角)的結構。

3、haar特徵的子特徵生成 
Haar特徵矩形特徵可位於圖像任意位置,大小也可以任意改變,所以矩形特徵值是矩形模版類別、矩形位置和矩形大小這三個因素的函數。故類別、大小和位置的變化,使得很小的檢測窗口含有非常多的矩形特徵,如:在24*24像素大小的檢測窗口內矩形特徵數量可以達到16萬個。白:黑區域面積比始終保持不變 
以x3特徵爲例,在放大+平移過程中白:黑:白麪積比始終是1:1:1。首先在紅框所示的檢測窗口中生成大小爲3個像素的最小x3特徵;之後分別沿着x和y平移產生了在檢測窗口中不同位置的大量最小3像素x3特徵;然後把最小x3特徵分別沿着x和y放大,再平移,又產生了一系列大一點x3特徵;然後繼續放大+平移,重複此過程,直到放大後的x3和檢測窗口一樣大。這樣x3就產生了完整的x3系列特徵。 
這裏寫圖片描述
那麼這些通過放大+平移的獲得的子特徵到底總共有多少個? 
假設檢測窗口大小爲W*H,矩形特徵大小爲w*h,X和Y爲表示矩形特徵在水平和垂直方向的能放大的最大比例係數: 
這裏寫圖片描述 
則總共可以獲得的子特徵數目爲: 
這裏寫圖片描述 
公式解釋: 
1. 特徵框豎直放大1倍,即無放大,豎直方向有(H-h+1)個特徵 
2. 特徵框豎直放大2倍,豎直方向有(H-2h+1)個特徵 
3. 特徵框豎直放大3倍,豎直方向有(H-3h+1)個特徵 
4.如此到豎直放大Y=floor(H/h)倍,豎直方向有1個特徵,即(H-Y*h+1) 
那麼豎直方向總共有(H-h+1)+(H-2h+1)+(H-3h+1)+……+(H-Y*h+1)=Y[H+1-h(1+Y)/2]個特徵。 
5.同理,在水平方向共有(W-w+1)+(W-2w+1)+(W-3w+1)+……+(W-X*w+1)=X[W+1-w(1+X)/2]。 
6.由於水平方向和垂直方向相互獨立,所以子特徵數目爲:子特徵數目 = 水平方向數目X垂直方向數目 
一般而言,haar特徵值計算出來的值跨度很大,所以在實際的特徵提取中時,一般會對haar特徵再進行標準化,壓縮特徵值範圍。

4、Haar-like特徵的計算-積分圖 
目標:如何快速計算Haar特徵值 
手段:積分圖。積分圖就是隻遍歷一次圖像就可以求出圖像中所有區域像素和的快速算法,大大的提高了圖像特徵值計算的效率。 
積分圖主要的思想:將圖像從起點開始到各個點所形成的矩形區域像素之和作爲一個數組的元素保存在內存中,當要計算某個區域的像素和時可以直接索引數組的元素,不用重新計算這個區域的像素和,從而加快了計算(這有個相應的稱呼,叫做動態規劃算法)。積分圖能夠在多種尺度下,使用相同的時間(常數時間)來計算不同的特徵,因此大大提高了檢測速度。 
我們來看看它是怎麼做到的。 
積分圖是一種能夠描述全局信息的矩陣表示方法。積分圖的構造方式是位置(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的四個頂點分別爲1、2、3、4,則D的像素和可以表示爲 
Dsum = ii( 1 )+ii( 4)-(ii(2)+ii(3 )); 
而Haar-like特徵值無非就是兩個矩陣像素和的差,同樣可以在常數時間內完成。所以矩形特徵的特徵值計算,只與此特徵矩形的端點的積分圖有關,所以不管此特徵矩形的尺度變換如何,特徵值的計算所消耗的時間都是常量。這樣只要遍歷圖像一次,就可以求得所有子窗口的特徵值。 
在實際中,如果使用旋轉特徵,則需要多計算一張積分圖。但是旋轉特徵的效果往往不理想,得不償失,不建議使用。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章