【opencv】22.HOG的原理与详细步骤
一般用到hog做特征描述子的情況就是,這個window只包含目標物體,很少含其他物體。例如經過目標檢測提取的行人roi圖像,我們用這只包含人的roi圖像進行hog特征描述子提取。當然,我們可以直接把這roi部分的圖像直接resize為一個行向量,作為SVM的輸入,但是這樣會有很多干擾,如果進一步提取hog的話,就會有很多邊緣細節,能讓svm更快收斂,并且模型識別度更好。
cv::HOGDescriptor類的構造函數的各參數的定義:
CV_WRAP HOGDescriptor() : winSize(64,128), // detect window blockSize(16,16), // block 大小 blockStride(8,8), // overlap block的滑動步長 cellSize(8,8), // cell 大小 nbins(9), // 直方圖的bin個數 derivAperture(1), // 微分算子核 winSigma(-1), // 在window上進行高斯加權 histogramNormType(HOGDescriptor::L2Hys), // 直方圖歸一化類型 L2HysThreshold(0.2), // L2-norm followed by clipping (limiting the maximum values of v to 0.2) and renormalising gammaCorrection(true), // Gamma校正,去除光照影響 nlevels(HOGDescriptor::DEFAULT_NLEVELS) // 分層數以下是一個hog_descriptor.xml的舉例:
<?xml version="1.0"?> <opencv_storage> <hog_descriptor type_id="opencv-object-detector-hog"><winSize>16 16</winSize><blockSize>8 8</blockSize><blockStride>4 4</blockStride><cellSize>4 4</cellSize><nbins>9</nbins><derivAperture>1</derivAperture><winSigma>2.</winSigma><histogramNormType>0</histogramNormType><L2HysThreshold>2.0000000000000001e-01</L2HysThreshold><gammaCorrection>1</gammaCorrection><nlevels>64</nlevels><signedGradient>1</signedGradient></hog_descriptor> </opencv_storage>下面我們來介紹HOG特征的提取過程:
1.圖像預處理
- 灰度化,因為Hog特征提取的是紋理特征,顏色信息不起作用,所以現將彩色圖轉為灰度圖;
- 歸一化,為了提高檢測器對光照等干擾因素的魯棒性,需要對圖像進行Gamma校正,以完成對整個圖像的歸一化,目的是調節圖像的對比度,降低局部光照和陰影所造成的影響,同時也可以降低噪音的干擾;
未經gamma校正和經過gamma校正保存圖像信息:未經gamma校正的情況下,低灰度時,有較大范圍的灰度值被保存成同一個值,造成信息丟失;同時高灰度值時,很多比較接近的灰度值卻被保存成不同的值,造成空間浪費。經過gamma校正后,改善了存儲的有效性和效率。
? γ值以1為分界,值越小,對圖像低灰度部分的擴展作用就越強,值越大,對圖像高灰度部分的擴展作用就越強,通過不同的γ值,就可以達到增強低灰度或高灰度部分細節的作用。
? 伽馬變換對于圖像對比度偏低,并且整體亮度值偏高(對于于相機過曝)情況下的圖像增強效果明顯。
先把像素值f(x,y)f(x,y)f(x,y)進行歸一化,把f(x,y)f(x,y)f(x,y)變為(0~1)范圍,可以是f(x,y)255\frac{f(x,y)}{255}255f(x,y)?, 然后進行gamma校正:
fγ(x,y)=255?(f(x,y)255)γ,................f(x,y)→(0,255)f_{\gamma}(x,y)=255*{(\frac{f(x,y)}{255})}^{\gamma} ,................f(x,y)\to(0,255)fγ?(x,y)=255?(255f(x,y)?)γ,................f(x,y)→(0,255)
乘以255是為了恢復為原來的像素值。
float fGamma=0.5; pixel_value = std::pow((float)((pixel_value/255.0), fGamma) * 255.0;即gamma校正就是對像素值做指數運算。
γ\gammaγ一般取1/2, 我們一般使用歸一化后的灰度值進行gamma校正。
2.統計細胞單元(Cell)的梯度方向直方圖:
將圖像劃分成小的Cell,將梯度方向映射到180度的范圍內,將像素的梯度幅值作為權值進行投影,用梯度方向決定向哪一維進行投影;
假如該像素的梯度方向為20度,梯度幅值為10,那么直方圖的第二維就加10。
下圖是一個細胞單元內的方向梯度直方圖,角度分辨率是在180度的范圍內,以20度等分,即一個細胞單元的HOG特征是一個9維的向量。
3.統計塊(Block)的梯度方向直方圖:
統計每個細胞單元內的梯度直方圖,形成每個細胞單元的描述子,由cell組成更大的描述子,稱為塊,將一個塊內四個cell的特征向量串聯起來就構成了該塊的梯度方向直方圖,按照一個細胞單元是9維的Hog特征,則一個Block塊的Hog特征為4x9=36維。
4.梯度做局部對比度歸一化:
由于局部光照的變化,以及前景背景對比度的變化,使得梯度強度的變化范圍非常大,這就需要對梯度做局部對比度歸一化。這里的策略是針對每個block塊進行對比度歸一化,一般使用L2-norm。
5.統計窗口(Window)的梯度方向直方圖:
只需要將窗口內所有塊的Hog特征向量串聯起來就得到了Window的Hog特征;
對于一個window窗口,會分成好多個block,是通過設置block滑動的步長stride來求出來的,
例如window是16x16 pixel大小,Block是8x8 pixel大小,blockStride步長是4,那么最終一個window會有(16-8)/4+1=3,即3x3=9個block,那么一個window就是9x36=324維向量,這就是最終的hog描述子。
6.統計整幅圖像的梯度方向直方圖:
一幅圖像可以無重疊的劃分為多個Window,這時將所有Window的特征向量串聯起來就是整幅圖像的Hog特征了,如果Window的大小和圖像的大小相同,那么Window的Hog特征就是整幅圖像的Hog特征,這也是最終分類使用的特征向量。
為什么要先將圖像劃分成Cell,再將Cell組成更大的塊?
這里的Cell相當于局部特征提取,Block塊是幾個Cell的組合,是比Cell更大的局部特征,事實上,block塊之間是有重疊的,也就是說,每個細胞單元的直方圖都會被多次用于最終的描述子的計算。相互重疊是為了區分更細的局部特征,最后由于局部光照和背景的變化,再對塊內的特征進行歸一化。此方法看起來有冗余,但可以顯著的提升性能。實驗表明:小尺度梯度,精細的方向采樣,相對粗糙的空間采樣,和重疊描述子塊中高質量的局部對比度歸一化都對好的檢測效果至關重要。
本文參考了下面的博客,鏈接:https://www.jianshu.com/p/6f69c751e9e7
《新程序員》:云原生和全面數字化實踐50位技術專家共同創作,文字、視頻、音頻交互閱讀總結
以上是生活随笔為你收集整理的【opencv】22.HOG的原理与详细步骤的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【Tools】怎样转载博客到CSDN博客
- 下一篇: 【opencv】25.图像卷积cv::f