HOG,英文全稱為Locally Normalised Histogram of Gradient Orientation in Dense Overlapping Grids,即局部歸一化的梯度方向直方圖,是一種對圖像局部重疊區域的密集型描述符,它統計圖像的局部區域的梯度方向信息作為局部凸顯該區域的表徵。具體來說,將梯度方向(0°~360°)劃分成9個區間,將圖像劃分成16×16像素的若干塊(Block),每個塊再劃分成4個8×8像素的單元格(Cell)。對於每一個Cell,計算每一像素點的梯度方向和模,按梯度方向增加對應bin的值,最終綜合n個Cell的梯度直方圖形成一個高維描述子向量[13-16]。
7.11.1 HOG算法的使用
在Windows 7環境下,安裝CodeBlock編譯環境,並配置OpenCV。
該算法對應的項目名稱是HoG_Project。具體執行步驟如下。
(1)打開HoG_Project文件夾,然後用CodeBlocks打開HoG_Project.cbp文件。
(2)如果不修改輸入數據及相關參數,則直接執行(4)。
(3)如果修改數據,則可在主函數中的第一行代碼中進行修改:
其中,readImg的第一個參數是圖像集的文件名,第二個參數是圖像文件的後綴名。
(4)運行HoG.cpp文件即可。
注意:本實驗中使用的圖像為灰度圖,尺寸大小都是相同的。
7.11.2 HOG算法原理
在 OpenCV 中,HOG描述子是針對一個檢測窗口而言的,一個窗口有[(128-16)/8+1]×[(64-16)/8+1]=105個Block,一個Block有4個Cell,一個Cell的HOG描述子向量的長度是9,所以一個檢測窗口的HOG描述子的向量長度是105×4×9=3780維。文獻[15]中給出了HOG算法原理的步驟:
(1)灰度化圖像處理。在本實驗中,圖像集是灰度圖,所以該算法代碼就沒有再對圖像一一進行灰度化處理。
(2)計算圖像每一個像素的梯度,該梯度包括大小和方向。計算圖像橫坐標和縱坐標的梯度,在此基礎上求每個像素位置的梯度方向值。這一步不僅可以捕獲輪廓和紋理信息,還可以進一步弱化光照的影響。
(3)將圖像分割成小的Cell。一個Cell是HOG特徵最小的結構單位,Block和窗口win的滑動步長就是一個Cell的寬度或高度,因此,需要先把整幅圖像分割成一個個的Cell。
(4)為每個Cell構建梯度方向直方圖。這是最關鍵的一步,它主要是統計局部圖像梯度信息並進行量化,得到局部圖像區域的特徵描述向量。
(5)將Cell組成大的Block,然後Block內歸一化梯度直方圖。這也是很關鍵的一步。
(6)生成HOG特徵描述向量。將所有的Block的HOG描述符組合在一起,形成最終的特徵向量,該特徵向量描述了檢測窗口的圖像內容。
在本實驗中,我們使用的圖像集全部都是灰度圖,尺寸大小都是150×200像素。在本實驗中檢測窗口的大小為64×128像素(其中Block大小為16×16像素,Block的滑動步長為8×8像素,Cell大小為8×8像素,一個Cell內統計9個方向的梯度直方圖),窗口滑動步長為64×64像素,擴充像素數為42×56像素。也就是說,寬擴充42個像素點,高擴充56個像素點,因此每一幅圖像的檢測窗口共有9個,即我們使用3780×9=34 020維度的特徵向量表示每一幅圖像。於是,我們便得到了每一幅圖像的表示,接著進行圖像之間的匹配,本算法中我們使用的是歐氏距離度量方法。閾值為16,也就是說,我們認為歐氏距離小於16的圖像都是相似圖像。
7.11.3 HOG算法實現
我們使用的是OpenCV中的HOG特徵提取功能,它使用了HOGDescriptor類的封裝。下面程序中的部分代碼來自文獻[13-16]。
7.11.4 HOG算法的實驗數據、實驗結果及分析
1.實驗數據
實驗輸入數據為150×200像素的原始圖像,數據集路徑為「..HoG_Projectimage150×200」。輸入的測試圖像為文件夾中的第一個圖像。實驗輸出數據為圖像的序號和圖像之間的距離,輸出數據存於「.HoG_ProjectHoG_distance.txt」。
2.實驗結果
查詢圖像如圖7-17所示。
圖7-17 查詢圖像(7)
檢索出的部分相似圖像如圖7-18所示。
圖7-18 檢索出的部分相似圖像(7)
以下是HoG_distance.txt的部分內容展示,如表7-7所示。
表7-7 HoG_distance.txt部分內容展示
續表
3.實驗分析
從檢索結果中我們發現,返回結果並不多,但是結果中的誤報數很小(為零),所有返回的圖像都與查詢相關。本次實驗的查准率是37/37×100%=100%,查全率是37/42×100%=88.095%。