Hog特徵、Haar特徵

HOG:

http://blog.csdn.net/abcjennifer/article/details/7365651(轉載)

HOG即histogram of oriented gradient, 是用於目標檢測的特徵描述子,該技術將圖像局部出現的方向梯度次數進行計數,該方法和邊緣方向直方圖、scale-invariant feature transform類似,不同的是hog的計算基於一致空間的密度矩陣來提高準確率。Navneet Dalal and Bill Triggs首先在05年的CVPR中提出HOG,用於靜態圖像or視頻的行人檢測。


HOG特徵原理:

HOG的核心思想是所檢測的局部物體外形能夠被光強梯度或邊緣方向的分佈所描述。通過將整幅圖像分割成小的連接區域(稱爲cells),每個cell生成一個方向梯度直方圖或者cell中pixel的邊緣方向,這些直方圖的組合可表示出(所檢測目標的目標)描述子。爲改善準確率,局部直方圖可以通過計算圖像中一個較大區域(稱爲block)的光強作爲measure被對比標準化,然後用這個值(measure)歸一化這個block中的所有cells.這個歸一化過程完成了更好的照射/陰影不變性。

與其他描述子相比,HOG得到的描述子保持了幾何和光學轉化不變性(除非物體方向改變)。因此HOG描述子尤其適合人的檢測。

通俗的講:

HOG特徵提取方法就是將一個image:

1.            灰度化(將圖像看做一個x,y,z(灰度)的三維圖像)

2.            劃分成小cells(2*2)

3.            計算每個cell中每個pixel的gradient(即orientation)

4.            統計每個cell的梯度直方圖(不同梯度的個數),即可形成每個cell的descriptor

使用HOG訓練樣本方法步驟:http://blog.csdn.net/t1234xy4/article/details/51543452


1、HOG特徵:http://www.open-open.com/lib/view/open1440832074794.html(轉載)

(1)主要思想:

在一副圖像中,局部目標的表象和形狀(appearance and shape)能夠被梯度或邊緣的方向密度分佈很好地描述。(本質:梯度的統計信息,而梯度主要存在於邊緣的地方)。

(2)具體的實現方法是:

首先將圖像分成小的連通區域,我們把它叫細胞單元。然後採集細胞單元中各像素點的梯度的或邊緣的方向直方圖。最後把這些直方圖組合起來就可以構成特徵描述器。

(3)提高性能:

把這些局部直方圖在圖像的更大的範圍內(我們把它叫區間或block)進行對比度歸一化(contrast-normalized),所採用的方 法是:先計算各直方圖在這個區間(block)中的密度,然後根據這個密度對區間中的各個細胞單元做歸一化。通過這個歸一化後,能對光照變化和陰影獲得更 好的效果。

(4)優點:

與其他的特徵描述方法相比,HOG有很多優點。首先,由於HOG是在圖像的局部方格單元上操作,所以它對圖像幾何的和光學的形變都能保持很好的不 變性,這兩種形變只會出現在更大的空間領域上。其次,在粗的空域抽樣、精細的方向抽樣以及較強的局部光學歸一化等條件下,只要行人大體上能夠保持直立的姿 勢,可以容許行人有一些細微的肢體動作,這些細微的動作可以被忽略而不影響檢測效果。因此HOG特徵是特別適合於做圖像中的人體檢測的。

2、HOG特徵提取算法的實現過程:

大概過程:

HOG特徵提取方法就是將一個image(你要檢測的目標或者掃描窗口):

1)灰度化(將圖像看做一個x,y,z(灰度)的三維圖像);

2)採用Gamma校正法對輸入圖像進行顏色空間的標準化(歸一化);目的是調節圖像的對比度,降低圖像局部的陰影和光照變化所造成的影響,同時可以抑制噪音的干擾;

3)計算圖像每個像素的梯度(包括大小和方向);主要是爲了捕獲輪廓信息,同時進一步弱化光照的干擾。

4)將圖像劃分成小cells(例如6*6像素/cell);

5)統計每個cell的梯度直方圖(不同梯度的個數),即可形成每個cell的descriptor;

6)將每幾個cell組成一個block(例如3*3個cell/block),一個block內所有cell的特徵descriptor串聯起來便得到該block的HOG特徵descriptor。

7)將圖像image內的所有block的HOG特徵descriptor串聯起來就可以得到該image(你要檢測的目標)的HOG特徵descriptor了。這個就是最終的可供分類使用的特徵向量了。


Haar特徵:

1Haar特徵:
   
Haar特徵分爲三類:邊緣特徵、線性特徵、中心特徵和對角線特徵,組合成特徵模板。特徵模板內有白色和黑色兩種矩形,並定義該模板的特徵值爲白色矩形像素和減去黑色矩形像素和。

1、Haar-like特徵  http://www.open-open.com/lib/view/open1440832074794.html(轉載)

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

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

圖像特徵提取三大法寶:HOG特徵,LBP特徵,Haar特徵

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

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

應用:http://blog.csdn.net/sunboyiris/article/details/38168111

haar特徵檢測流程  http://blog.csdn.net/nongfu_spring/article/details/38977555

下面爲HAAR特徵檢測的具體流程

一.在計算每個窗口的haar值時,使用CvHidHaarClassifierCascade結構的casecade,因此需要以下步驟。

1. 創建CvHidHaarClassifierCascade結構對應的casecade

     即申請內存,並填寫casecade中相關的頭信息,如有多少個stage,每個stage下有多少個tree,每個tree下有多少個node,以及相關的閾值等信息。


2. 填寫每個haar feature對應的積分圖中矩形框的指針。

     包括casecade指向的積分圖的指針sum,更多的是相應haar特徵對應的矩形框指針以及權重。每個haar特徵對應着2個或者3個帶權重的矩形框,分別用p0,p1,p2,p3指向每個矩形框的四個頂點在積分圖中的相應位置。


另外,這裏haar特徵對應的矩形框是根據窗口大小變化的。如樣本是20*20,某個haar特徵對應的某一個矩形框是4*4,當scanWindow的窗口放大爲40*40時,該矩形框也擴大爲8*8

所有的矩形框頂點的指針都是基於原圖的積分圖的,當窗口縮放時,其haar特徵對應的矩形框的頂點位置也會發生相應的縮放。


二.有了CvHidHaarClassifierCascade結構的casecade,就可以計算每個window對應的stage值了。實際上,在每一個window尺寸上創建好casecade後,就會計算該window大小下所有窗口的stage值,保存滿足條件的那些窗口。然後再創建下一個縮放window尺寸上的casecade,並替換掉上一個尺寸的casecade,再計算新window大小下所有窗口的stage值,繼續保存滿足條件的那些窗口。如此循環,直至縮放的窗口小於樣本的尺寸,或者縮放的窗口大於原圖的尺寸。其中計算每個固定尺寸窗口的stage值的過程見三中詳述。


三.計算每一個window尺寸上所有窗口的stage值。將滿足條件的窗口保存下來。這個過程用cvRunHaarClassifierCascadeSum函數判斷,當cvRunHaarClassifierCascadeSum返回值大於0,纔會保存此時檢測的窗口位置,作爲備選,參與後面的聚類過程。

1. static int cvRunHaarClassifierCascadeSum ( const CvHaarClassifierCascade* _cascade,CvPoint pt, int start_stage )

其中入參cascade爲分類器,pt爲檢測窗口的左上角的座標。其中窗口大小已經在外層保存了。start_stage爲計算串口haar值的起始stage,若爲0,則所有的stage都參與計算。

        該函數計算指定窗口中分類器對應的haar值,並根據分類器的結果判定是否滿足要求。滿足返回1,不滿足返回0


2. cvRunHaarClassifierCascadeSum函數調用icvEvalHidHaarClassifier來計算出每個樹對應節點的haar特徵值,然後再和該節點的閾值比較,如果小於閾值,就進去左邊分支;如果大於閾值,就進入右邊分支;直至分支的索引小於等於0,此時得到的alpha爲該樹的計算結果。


            icvEvalHidHaarClassifier函數在計算指定窗口中分類器對應的haar值,使用了積分圖。即使用該windown尺寸下casecade中所有haar特徵的p0,p1,p2,p3。每移動一次窗口,p0,p1,p2,p3指針移動相應的位置,再計算(*p0+*p3-*p1-*p2),其值爲圖像中矩形框位置的灰度和。將其乘以相應的權重,即可得到haar特徵值。下面爲相應的代碼:

do

{

CvHidHaarTreeNode* node = classifier->node + idx;

double t = node->threshold * variance_norm_factor;

double sum = calc_sum(node->feature.rect[0],p_offset) * node->feature.rect[0].weight;

sum += calc_sum(node->feature.rect[1],p_offset) * node->feature.rect[1].weight;

if( node->feature.rect[2].p0 )

    sum += calc_sum(node->feature.rect[2],p_offset) * node->feature.rect[2].weight;

idx = sum < t ? node->left : node->right;

}

while( idx > 0 );

3. 當用icvEvalHidHaarClassifier計算所有樹的節點後,再判斷所有樹的累積和(所有樹的alpha之和)是否大於stage閾值,如果大於閾值則返回1,否則返回負值。返回1,則再進行下一個stage計算,直至所有的stage計算完畢,並且每個累積和都大於每個stage相應的閾值,則cvRunHaarClassifierCascadeSum返回1

這時一個窗口計算完畢,保存此時檢測的窗口位置,作爲備選,參與後面的聚類過程。

然後平移窗口,重複上述,2,3的步驟,直至窗口移動到圖像的右下邊界。

四.當所有滿足尺寸要求的窗口遍歷完畢,並將滿足條件的窗口保存完畢後,再對保存的窗口進行聚類,和最小鄰域過濾。


發佈了49 篇原創文章 · 獲贊 21 · 訪問量 7萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章