1. 程式人生 > >學習筆記之——HOG、LBP與Haar特徵(未完待續)

學習筆記之——HOG、LBP與Haar特徵(未完待續)

本博文為HOG、LBP與Haar運算元的學習筆記。

 

方向梯度直方圖HOG

主要參考博文如下:

https://blog.csdn.net/wjb820728252/article/details/78395092(這篇博文翻譯水平真的太爛了,可以參考裡面給的原連結)

https://blog.csdn.net/liulina603/article/details/8291093

參考書籍:《Opencv影象處理程式設計例項》

 

Histogram of Oriented Gradients,HOG是應用在計算機視覺和影象處理領域,用於目標檢測的特徵描述器。這項技術是用來計算區域性影象梯度的方向資訊的統計值。是Dalal於2005年針對行人檢測問題提出的直方圖特徵,常用於計算機視覺和影象處理中的目標物體檢測與特徵分析。(論文原文:https://wenku.baidu.com/view/676f2351f01dc281e53af0b2.html)

方向梯度直方圖HOG特徵是一種在計算機視覺和影象處理中用來進行物體檢測的特徵描述子。它通過計算和統計影象區域性區域的梯度方向直方圖來構成特徵。HOG特徵結合SVM分類器已經被廣泛應用在行人檢測中。

特徵描述符是指通過提取有用的資訊並拋棄無關的資訊來表示這一張圖片或者一張圖片的一部分。

從影象中提取有用資訊,什麼是有用資訊呢?所提取的特徵向量對於檢視影象是沒有用的,但是對於影象識別或者目標檢測等任務則是非常有用。在HOG中,梯度方向(梯度)的分佈(直方圖)作為特徵。影象的梯度的大小在邊緣和拐角處(強度突變的區域)較大,而在邊和角的形狀資訊比平面多很多,故此可以以此作為特徵。

HOG的主要思想:在一幅影象中,區域性目標的表象和形狀(appearance and shape)能夠被梯度或邊緣的方向密度分佈很好地描述。(本質:梯度的統計資訊,而梯度主要存在於邊緣的地方)。

HOG的具體實現方法是:首先將影象分成小的連通區域,我們把它稱為細胞單元。然後採集細胞單元中各畫素點的梯度或邊緣的方向直方圖。最後把這些直方圖組合起來就可以構成特徵描述器。

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

 

HOG原理

影象直方圖中特徵值為由的畫素構成的特徵直方圖為:

其中,表示畫素個數的歸一化處理值,特徵直方圖反映出來的是某一特徵的概率分佈。對於灰度影象,直方圖就是灰度資訊統計概率分佈,對進行累計,得到對應的累計直方圖為:

HOG的原理是通過計算和統計影象區域性區域的梯度方向直方圖來實現特徵描述的。對於一幅影象,它在點處的梯度幅度為:

梯度的方向角為:

其中,分別為x方向與y方向的梯度,HOG在進行特徵描述時將梯度方向角區間劃分為N個均勻空間,畫素點在k個梯度方向上的梯度投影為:

 

HOG特徵提取步驟:

影象梯度方向直方圖就是對影象中所有畫素點K維梯度特徵的直方圖統計,將影象劃分成小部分連通域,對細胞單元的各個畫素點進行梯度方向直方圖描述,最後組合成相應的特徵描述器。

1、預處理

由於顏色資訊作用不大,通常先轉換為灰度影象。

然後進行歸一化處理。歸一化操作是為了提高影象特徵描述對光照及環境變化的魯棒性,降低影象區域性的陰影、區域性曝光過多及紋理失真,儘可能抑制噪聲干擾。採用Gamma伽馬校正法對輸入影象進行顏色空間的標準化(歸一化)。目的是調節影象的對比度,降低影象區域性的陰影和光照變化所造成的影響,同時可以抑制噪聲的干擾。

為了減少光照因素的影響,首先需要對整個影象進行規範化(歸一化)。在影象的紋理強度中,區域性的表層曝光貢獻的比重較大,所以,這種壓縮處理能夠有效地降低影象區域性的陰影和光照變化。

Gamma壓縮公式:

特徵描述符將大小寬度*高度*3(RGB通道)的影象轉換為特徵向量陣列,長度為n。此處分析中採用64*128。如下圖所示,一幅尺寸為720*475的影象,在計算HOG特徵描述符時選擇大小為100*200的影象,再將該影象提取與剪裁為64*128大小。

 

2、計算影象梯度

梯度包括了方向和大小。主要是為了捕獲輪廓資訊,同時進一步弱化光照的干擾。對於影象,計算影象在處的水平方向梯度,豎直方向梯度為,計算水平與豎直方向梯度只需要對影象進行模板卷積即可得到,水平模板為[-1,0,1],豎直模板為。通過使用下圖所示的核心濾波影象則可以實現計算水平和垂直梯度。

通過下面公式計算梯度的大小和方向:

使用任意一種梯度運算元,例如:Sobel,Laplacian等,對影象進行卷積,計算得到每個畫素點處的梯度方向和幅值。

下面給出用opencv實現梯度計算的程式

#include <opencv2\core\core.hpp>
#include <opencv2\highgui\highgui.hpp>
#include<opencv2\imgproc\imgproc.hpp>

using namespace cv;
using namespace std;

int main()
{
	Mat img = imread("666666.jpg");
	imshow("原圖", img);

	img.convertTo(img, CV_32F, 1 / 255.0);//見下面程式補充,用於轉換不同資料型別的Mat
	imshow("convertTo", img);

	//計算影象梯度
	Mat gx, gy;
	//求x梯度
	Sobel(img, gx, CV_32F, 1, 0, 1);//Sobel邊緣檢測運算元,見下面程式補充
	Sobel(img, gy, CV_32F, 0, 1, 1);

	imshow("gx", gx);
	imshow("gy", gy);

	//使用函式cartToPolar計算梯度的大小和方向
	Mat mag, angle;
	cartToPolar(gx, gy, mag, angle, 1);

	imshow("mag", mag);
	imshow("angle", angle);


	waitKey(0);
	return 0;

}

結果如下圖所示:

梯度x在垂直方向延伸,梯度y在水平方向延伸。梯度的強度在影象強度突變的地方有急劇的變化。

關於上述程式碼的補充:

關於openCV中convertTo的用法

關於Sobel函式:

可參考博文:https://blog.csdn.net/poem_qianmo/article/details/25560901

 

 

3、統計影象梯度

將影象劃分為小的cells,如8*8個方格單元,統計每個cell的梯度直方圖(不同梯度的個數),即可形成每個cell的descriptor。

將幾個cell組成一個block,如2*2個單元組成一個塊,然後對屬於塊內的畫素點進行投票統計,計算每個方塊單元的梯度特徵,每個畫素點梯度方向都採用線性插值,將每個方塊單元梯度特徵組合在一起。一個block內所有cell的特徵descriptor串聯起來便得到該block的HOG特徵描述子。將影象內的所有block的HOG特徵描述子串聯起來就可以得到該影象的HOG特徵描述子了,這個就是最終可供分類使用的特徵向量

(1)為每個細胞單元構建梯度方向直方圖。將影象分成若干個“單元格cell”,例如每個cell為6*6個畫素。假設我們採用9個bin的直方圖來統計這6*6個畫素的梯度資訊。也就是將cell的梯度方向360度分成9個方向塊。如下圖所示,例如,如果這個畫素的梯度方向是20-40度,直方圖第2個bin的計數就加一。這樣,對cell內每個畫素用梯度方向在直方圖中進行加權投影(對映到固定的角度範圍),就可以得到這個cell的梯度方向直方圖了,就是該cell對應的9維特徵向量(因為有9個bin)。而對於梯度的大小,則是作為投影的權值。比如某個畫素的梯度方向是20-40度,當它梯度大小是2時,計數就+2;當梯度大小為1時,計數就+1.

(2)把細胞單元組合成大的塊(block),塊內歸一化梯度直方圖。由於區域性光照的變化以及前景-背景對比度的變化,使得梯度強度的變化範圍非常大。這就需要對梯度強度做歸一化。歸一化能夠進一步地對光照、陰影和邊緣進行壓縮。把各個細胞單元合成大的、空間上連通的區間(block)。這樣,一個block內所有cell的特徵向量串聯起來便得到該block的HOG特徵。這些區間是互有重疊的,這就意味著:每一個單元格的特徵會以不同的結果多次出現在最後的特徵向量中。我們將歸一化之後的塊描述符(向量)就稱之為HOG描述符。

區間有兩個主要的幾何形狀——矩形區間(R-HOG)和環形區間(C-HOG)。R-HOG區間大體上就是一些方形格子,它可以由三個引數來表徵:每個區間中細胞單元的數目、每個細胞單元中畫素點的數目、每個細胞的直方圖通道數目。

例如:行人檢測的最佳引數設定是:3*3細胞/區間、6*6畫素/細胞、9個直方圖通道。則一塊的特徵數為:3*3*9。

將檢測視窗中所有重疊的塊進行HOG特徵的收集,並將它們結合成最終的特徵向量供分類使用。

 

從博文https://blog.csdn.net/datase/article/details/71374471補充截圖如下:

 

4、特徵向量歸一化

為克服光照不均勻變化及前景與背景的對比差異,需要對塊內特徵向量進行歸一化處理。首先對每個塊內36維特徵V進行歸一化,即完成操作,其中為很小的常數;然後利用重新進行歸一化,同時保持限制V的最大值為0.2。由於相鄰塊之間可能存在重疊,使得每個單元對塊都有影響,因此需要對梯度強度歸一化,使每一個單元格特徵以不同的結果多次出現在最後的特徵向量中。

 

5、生成特徵向量

將影象的每個特徵組合在一起,得到影象HOG特徵。設定步長為8畫素時,相鄰塊之間會有1~2個相鄰單元重疊,每個單元對周圍的4個塊都有貢獻。對於特徵維數計算,影象分為m*n個方格單元,且一個方塊單元由s*s個方格單元構成,最終得到HOG維數為(m-s+1)*(n-s+1)*(s*s*N)。

把樣本影象分割為若干個畫素的單元(cell),把梯度方向平均劃分為9個區間(bin),在每個單元(cell)裡面對所有畫素的梯度方向在各個方向區間進行直方圖統計,得到9維的特徵向量。每相鄰的4個單元構成一個塊(block),把一個塊內的特徵向量聯起來得到36維的特徵向量,用塊對樣本影象進行掃描,掃描步長為一個單元(cell)。最後將所有塊的特徵串聯起來就得到人體的特徵。例如,對於64*128的影象而言,每8*8的畫素組成一個cell,每2*2個cell組成一個block,因為每個cell有9個特徵,所以每個block內有4*9=36個特徵。以8個畫素為步長,那麼水平方向有7個掃描視窗,垂直方向有15個掃描視窗。也就是說64*128的影象有36*7*15=3780個特徵。

 

下面給出HOG特徵的程式碼:

Opencv中提供了專門用於HOG特徵檢測的類HOGDescriptor。