文章主要參考自?目標(biāo)檢測(cè)的圖像特征提取之(一)HOG特征?和?OpenCV HOGDescriptor 參數(shù)圖解
一邻眷、HOG的定義
HOG(方向梯度直方圖)特征是一種在計(jì)算機(jī)視覺和圖像處理中用來進(jìn)行物體檢測(cè)的特征描述子鸥昏。它通過計(jì)算和統(tǒng)計(jì)圖像局部區(qū)域的梯度方向直方圖來構(gòu)成特征。
二、HOG特征的提取步驟
1)因?yàn)轭伾畔⒆饔貌淮蠡打冢詫?duì)目標(biāo)圖像進(jìn)行灰度化哺窄;
2)采用Gamma校正法對(duì)灰度圖進(jìn)行標(biāo)準(zhǔn)化(歸一化);目的是調(diào)節(jié)圖像的對(duì)比度呻袭,降低圖像局部的陰影和光照變化所造成的影響眨八,同時(shí)可以抑制噪音的干擾;
3)計(jì)算灰度圖每個(gè)像素的梯度(包括大小和方向)左电;主要是為了捕獲輪廓信息廉侧,同時(shí)進(jìn)一步弱化光照的干擾。
最常用的方法是:首先用[-1,0,1]梯度算子(例如Sobel)對(duì)原圖像做卷積運(yùn)算篓足,得到x方向(水平方向段誊,以向右為正方向)的梯度分量gradscalx,然后用[1,0,-1]T梯度算子對(duì)原圖像做卷積運(yùn)算栈拖,得到y(tǒng)方向(豎直方向连舍,以向上為正方向)的梯度分量gradscaly。然后再用以下公式計(jì)算該像素點(diǎn)的梯度大小和方向涩哟。
4)將圖像劃分成小cells(例如8*8像素大小的cell)索赏;
5)統(tǒng)計(jì)每個(gè)cell的梯度直方圖(不同梯度的個(gè)數(shù)),即可形成每個(gè)cell的descriptor贴彼;
該步驟的目的是為局部圖像區(qū)域(cell)提供一個(gè)編碼潜腻,同時(shí)能夠保持對(duì)圖像中人體對(duì)象的姿勢(shì)和外觀的弱敏感性。
我們將圖像分成若干個(gè)“cell”器仗,例如每個(gè)cell為8*8個(gè)像素融涣。假設(shè)我們采用9個(gè)bin的直方圖來統(tǒng)計(jì)這8*8個(gè)像素的梯度信息童番。也就是將cell的梯度方向360度分成9個(gè)方向塊,如圖所示:例如:如果這個(gè)像素的梯度方向是20-40度威鹿,直方圖第2個(gè)bin的計(jì)數(shù)就加一剃斧,這樣,對(duì)cell內(nèi)每個(gè)像素用梯度方向在直方圖中進(jìn)行加權(quán)投影(映射到固定的角度范圍)忽你,就可以得到這個(gè)cell的梯度方向直方圖了幼东,就是該cell對(duì)應(yīng)的9維特征向量(因?yàn)橛?個(gè)bin)。
如下圖所示(圖中Zi塊其實(shí)就是第i個(gè)bin)
像素梯度方向用到了檀夹,那么梯度大小呢筋粗?梯度大小就是作為投影的權(quán)值的。例如說:這個(gè)像素的梯度方向是20-40度炸渡,然后它的梯度大小是2(假設(shè)澳纫凇),那么直方圖第2個(gè)bin的計(jì)數(shù)就不是加一了蚌堵,而是加二(假設(shè)奥蚓觥)
6)將每幾個(gè)cell組成一個(gè)block(例如 大小為16*16的block,即一個(gè)block由4個(gè)cell組成)吼畏,一個(gè)block內(nèi)所有cell的特征descriptor串聯(lián)起來便得到該block的HOG特征descriptor督赤。
由于局部光照的變化以及前景-背景對(duì)比度的變化,使得梯度強(qiáng)度的變化范圍非常大泻蚊。這就需要對(duì)梯度強(qiáng)度做歸一化躲舌。歸一化能夠進(jìn)一步地對(duì)光照、陰影和邊緣進(jìn)行壓縮性雄。
作者采取的辦法是:把各個(gè)細(xì)胞單元組合成大的没卸、空間上連通的區(qū)間(blocks)。這樣秒旋,一個(gè)block內(nèi)所有cell的特征向量串聯(lián)起來便得到該block的HOG特征约计。這些區(qū)間是互有重疊的(滑動(dòng)塊,例如block stride為8)迁筛,這就意味著:每一個(gè)單元格的特征會(huì)以不同的結(jié)果多次出現(xiàn)在最后的特征向量中煤蚌。我們將歸一化之后的塊描述符(向量)就稱之為HOG描述符。
7)將圖像image內(nèi)的所有block的HOG特征descriptor串聯(lián)起來就可以得到該image(你要檢測(cè)的目標(biāo))的HOG特征descriptor了细卧。這個(gè)就是最終的可供分類使用的特征向量了尉桩。
最后一步就是將檢測(cè)窗口中所有重疊的塊進(jìn)行HOG特征的收集,并將它們結(jié)合成最終的特征向量供分類使用贪庙。
例如行人檢測(cè)的滑動(dòng)窗口大小通常為 64*128
以O(shè)penCV為例魄健,構(gòu)建 HOG 特征的默認(rèn)參數(shù)設(shè)置如下:
CV_WRAP HOGDescriptor() : winSize(64,128), blockSize(16,16), blockStride(8,8),
cellSize(8,8),?nbins(9),?derivAperture(1),?winSigma(-1),
histogramNormType(HOGDescriptor::L2Hys),?L2HysThreshold(0.2),?gammaCorrection(true),
nlevels(HOGDescriptor::DEFAULT_NLEVELS)
{}
8)特征向量的維數(shù)
Dalal提出的Hog特征提取的過程:把樣本圖像分割為若干個(gè)像素的單元(cell),把梯度方向平均劃分為9個(gè)區(qū)間(bin)插勤,在每個(gè)單元里面對(duì)所有像素的梯度方向在各個(gè)方向區(qū)間進(jìn)行直方圖統(tǒng)計(jì),得到一個(gè)9維的特征向量,每相鄰的4個(gè)單元(cell)構(gòu)成一個(gè)塊(block)农尖,把一個(gè)塊內(nèi)的特征向量聯(lián)起來得到36維的特征向量析恋,用塊對(duì)樣本圖像進(jìn)行掃描,掃描步長(zhǎng)為一個(gè)單元(block_stride = 8)盛卡。最后將所有塊的特征串聯(lián)起來助隧,就得到了人體的特征。例如滑沧,對(duì)于64*128的圖像而言并村,每16*16的像素組成一個(gè)cell,每2*2個(gè)cell組成一個(gè)塊滓技,因?yàn)槊總€(gè)cell有9個(gè)特征哩牍,所以每個(gè)塊內(nèi)有4*9=36個(gè)特征,以8個(gè)像素為步長(zhǎng)令漂,那么膝昆,水平方向?qū)⒂?個(gè)掃描窗口,垂直方向?qū)⒂?5個(gè)掃描窗口叠必。也就是說荚孵,64*128的圖片,總共有36*7*15=3780個(gè)特征纬朝。
總體流程圖: