什么是特征描述符
特征描述符是圖像或圖像塊的表示浪册,其通過提取有用信息和丟棄無關(guān)信息來簡化圖像咸产。
通常疲迂,特征描述符將一個(gè)width*height* 3(通道)的圖像轉(zhuǎn)換為長度為n的特征向量或數(shù)組昼汗。在HOG特征描述符的情況下毯焕,輸入圖像的大小為64×128×3菠齿,輸出特征向量的長度為3780剥槐。
在HOG特征描述符中损谦,梯度方向(定向梯度)的分布(直方圖)被用作特征。圖像的梯度(x和y導(dǎo)數(shù))是有用的找颓,因?yàn)樵谶吘壓徒锹洌ㄍ蝗粡?qiáng)度變化的區(qū)域)周圍的梯度幅度很大合愈,并且我們知道邊緣和角落包含關(guān)于物體形狀的更多信息而不是平坦區(qū)域。
如何計(jì)算方向梯度的直方圖?
在本節(jié)中佛析,我們將詳細(xì)介紹計(jì)算HOG特征描述符益老。為了說明每個(gè)步驟,我們將使用圖像的塊寸莫。
第1步:預(yù)處理
如前所述捺萌,用于行人檢測的HOG特征描述符是在圖像的64×128塊上計(jì)算的。當(dāng)然膘茎,圖像可以是任何尺寸桃纯。通常,在多個(gè)圖像位置處分析多個(gè)尺度的貼片披坏。唯一的限制是被分析的塊具有固定的寬高比态坦。在我們的例子中,塊需要具有1:2的寬高比棒拂。例如伞梯,它們可以是100×200,128×256或1000×2000但不是101×205。
為了說明這一點(diǎn)帚屉,我展示了一個(gè)大小為720×475的圖像谜诫。我們選擇了一個(gè)大小為100×200的塊來計(jì)算我們的HOG特征描述符。將這個(gè)塊從圖像中裁剪并調(diào)整為64×128」サ現(xiàn)在我們準(zhǔn)備為這個(gè)圖像塊計(jì)算HOG描述符喻旷。
圖1:提取-裁剪-resize過程
Dalal和Triggs的論文也提到了伽馬校正作為預(yù)處理步驟,但性能提升很小敬特,因此我們正在跳過這一步。
第2步:計(jì)算漸變圖像
要計(jì)算HOG描述符牺陶,我們需要首先計(jì)算水平和垂直梯度;?畢竟伟阔,我們想要計(jì)算梯度的直方圖。通過使用以下核來對圖像進(jìn)行濾波可以輕松實(shí)現(xiàn)這一點(diǎn)掰伸。
圖2:濾波核
在OpenCV中使用核大小為1的Sobel運(yùn)算符皱炉,我們也可以獲得相同的結(jié)果。
# Python 梯度計(jì)算
# 讀圖像
im = cv2.imread('bolt.png')
im = np.float32(im) / 255.0
# 計(jì)算梯度
gx = cv2.Sobel(img, cv2.CV_32F, 1, 0, ksize=1)
gy = cv2.Sobel(img, cv2.CV_32F, 0, 1, ksize=1)
復(fù)制代碼
接下來狮鸭,我們可以使用以下公式找到梯度的大小和方向:
在opencv中可以使用cartToPolar函數(shù)來實(shí)現(xiàn)
# Python 計(jì)算梯度大小和方向 (度為單位)
mag, angle = cv2.cartToPolar(gx, gy, angleInDegrees=True)
復(fù)制代碼
下圖顯示了梯度:
圖3:左:x-梯度的絕對值 中:y-梯度的絕對值 右梯度的大小
請注意合搅,x-gradient在垂直線上觸發(fā),y-gradient在水平線上觸發(fā)歧蕉。梯度的大小會隨著強(qiáng)度的急劇變化而發(fā)生灾部。當(dāng)該區(qū)域光滑時(shí),它們都不會產(chǎn)生惯退。我故意省略了顯示漸變方向的圖像赌髓,因?yàn)橐詧D像的方向傳達(dá)的信息不會太多。
梯度圖像刪除了許多非必要信息(例如恒定的彩色背景),但突出顯示了輪廓锁蠕。換句話說夷野,你可以查看梯度圖像,并且仍然可以輕松地說出圖片中有人荣倾。
在每個(gè)像素處悯搔,梯度具有幅度和方向。對于彩色圖像舌仍,評估三個(gè)通道的梯度(如圖3所示)妒貌。一個(gè)像素處的梯度的大小是三個(gè)通道的梯度的最大值,并且角度是對應(yīng)于最大梯度的角度抡笼。
步驟3:計(jì)算8×8單元中梯度的直方圖
在該步驟中苏揣,將圖像分成8×8個(gè)單元,并計(jì)算每個(gè)8×8單元的梯度直方圖推姻。
圖4:HOG的8*8cell
我們將在一瞬間了解直方圖平匈,但在我們做之前讓我們先了解為什么我們將圖像分成8×8個(gè)單元格。使用特征描述符描述圖像塊的一個(gè)重要原因是它提供了緊湊的表現(xiàn)藏古。8×8圖像塊包含8×8×3 = 192個(gè)像素值增炭。此塊的每個(gè)像素的梯度包含2個(gè)值(幅度和方向),最多可添加8x8x2 = 128個(gè)數(shù)字拧晕。到本節(jié)結(jié)束時(shí)隙姿,我們將看到如何使用9-bin直方圖表示這128個(gè)數(shù)字,這些直方圖可以存儲為9個(gè)數(shù)字的數(shù)組厂捞。不僅表示更緊湊输玷,計(jì)算塊上的直方圖使得這種表示對噪聲更加魯棒。個(gè)別的梯度可能有噪聲靡馁,但超過8×8塊的直方圖使得表示對噪音的敏感性降低欲鹏。
但為什么8×8塊呢?為什么不是32×32臭墨?它是我們正在尋找的特征尺度的設(shè)計(jì)選擇赔嚎。HOG最初用于行人檢測。行人照片中的8×8個(gè)cell縮放到64×128胧弛,足以捕捉有趣的特征(例如尤误,臉部,頭頂?shù)龋?/p>
直方圖的本質(zhì)是一個(gè)由9個(gè)bin組成的數(shù)組或向量结缚,每個(gè)bin對應(yīng)于角度0,20,40,60 ... 160损晤。
讓我們看看圖像中的一個(gè)8×8塊,看看梯度的外觀红竭。
圖5:中:箭頭表示RGB塊和梯度?右:同一塊中的數(shù)字表示梯度
如果你是計(jì)算機(jī)視覺的初學(xué)者沉馆,那么圖像中心的信息非常豐富码党。它顯示圖像的塊用箭頭表示梯度-箭頭顯示梯度的方向,其長度顯示幅度斥黑。注意箭頭的方向如何指向強(qiáng)度變化的方向揖盘,幅度表示差異有多大。
在右側(cè)锌奴,我們看到原始數(shù)字代表8×8單元格中的梯度兽狭,只有一個(gè)小差異-角度介于0和180度之間,而不是0到360度鹿蜀。這些被稱為“無符號”梯度箕慧,因?yàn)樘荻鹊呢?fù)方向也由相同的數(shù)字表示。換句話說茴恰,一個(gè)梯度箭頭和與其相對的180度的箭頭被認(rèn)為是相同的颠焦。但是,為什么不使用0 - 360度往枣?根據(jù)經(jīng)驗(yàn)伐庭,已經(jīng)表明無符號梯度比行人檢測的有符號梯度更有效。HOG的某些實(shí)例將允許你指定是否要使用帶符號的漸變分冈。
下一步是在這些8×8單元格中創(chuàng)建梯度直方圖圾另。直方圖包含9個(gè)bin對應(yīng)于角度0,20,40 ...... 160。
下圖說明了該過程雕沉。我們正在尋找與上圖相同的8×8塊的梯度的大小和方向集乔。基于方向選擇bin坡椒,并且基于幅度選擇投票(進(jìn)入bin中的值)扰路。讓我們首先關(guān)注藍(lán)色環(huán)繞的像素。它的角度(方向)為80度倔叼,幅度為2.所以它在第5個(gè)箱子中加2汗唱。使用紅色環(huán)繞的像素處的梯度具有10度的角度和4的大小。由于10度是0到20之間的一半缀雳,因此像素的投票均勻地分成兩個(gè)bin渡嚣。
圖6:梯度直方圖
還有一個(gè)細(xì)節(jié)需要注意梢睛。如果角度大于160度肥印,則介于160和180之間,我們知道角度包圍0和180等效绝葡。因此深碱,在下面的示例中,角度為165度的像素與0度箱和160度bin成比例藏畅。
圖7:梯度直方圖示例
將8×8cell中的所有像素的貢獻(xiàn)相加以創(chuàng)建9-bin直方圖敷硅。對于上面的塊功咒,它看起來像這樣
圖8:梯度直方圖化
在我們的表示中,y軸是0度绞蹦。你可以看到直方圖在0度和180度附近有很多權(quán)重力奋,這只是另一種說法,即塊的梯度要么方向向上要么方向向下幽七。
步驟4:16×16塊標(biāo)準(zhǔn)化
在上一步中景殷,我們基于圖像的梯度創(chuàng)建了直方圖。圖像的梯度對整體光照很敏感澡屡。如果將所有像素值除以2則使圖像變暗猿挚,則梯度幅度將改變一半,因此直方圖值將改變一半驶鹉。理想情況下绩蜻,我們希望描述符與光照變化無關(guān)。換句話說室埋,我們希望“標(biāo)準(zhǔn)化”直方圖办绝,以便它們不受照明變化的影響。
在我解釋直方圖是如何規(guī)范化之前词顾,讓我們看看長度為3的向量是如何規(guī)范化的八秃。
假設(shè)我們有一個(gè)RGB顏色矢量[128,64,32]。這個(gè)向量的長度是
肉盹。這也稱為向量的L2范數(shù)昔驱。將該向量的每個(gè)元素除以146.64得到歸一化向量[0.87,0.43,0.22]。現(xiàn)在考慮另一個(gè)向量上忍,其中元素是第一個(gè)向量2 x [128,64,32] = [256,128,64]的值的兩倍骤肛。你可以自己解決這個(gè)問題,看看規(guī)范化[256,128,64]會產(chǎn)生[0.87,0.43,0.22]窍蓝,這與原始RGB矢量的標(biāo)準(zhǔn)化版本相同.
現(xiàn)在我們知道如何規(guī)范化矢量腋颠,你可能會想到在計(jì)算HOG時(shí)可以簡單地將9×1直方圖歸一化,就像我們對上面的3×1矢量進(jìn)行歸一化一樣吓笙。這不是一個(gè)壞主意淑玫,但更好的想法是在更大尺寸的16×16塊上進(jìn)行標(biāo)準(zhǔn)化。16×16塊具有4個(gè)直方圖面睛,它們可以連接形成36×1元素向量絮蒿,并且可以按照3×1向量歸一化的方式進(jìn)行歸一化。然后將窗口以8個(gè)元素進(jìn)行移動(dòng)叁鉴,并在該窗口上計(jì)算歸一化的36×1矢量土涝,并重復(fù)該過程。
步驟5:計(jì)算HOG特征向量
為了計(jì)算整個(gè)圖像塊的最終特征向量幌墓,將36×1向量連接成一個(gè)大矢量但壮。這個(gè)載體的大小是多少冀泻?讓我們計(jì)算一下
1.我們有多少個(gè)16×16塊的位置?
有7個(gè)水平位置和15個(gè)垂直位置蜡饵,總共7 x 15 = 105個(gè)位置弹渔。
2.每個(gè)16×16塊由36×1向量表示。所以當(dāng)我們將它們?nèi)窟B接成一個(gè)大向量時(shí)溯祸,我們得到一個(gè)36×105 = 3780維向量捞附。
可視化方向梯度直方圖
通常通過在8×8的cell中繪制9×1標(biāo)準(zhǔn)化直方圖來可視化圖像塊的HOG描述符。如圖8所示您没,你會注意到直方圖的主導(dǎo)方向捕捉了人的形狀鸟召,特別是在軀干和腿部周圍。
不幸的是氨鹏,沒有簡單的方法可視化OpenCV中的HOG描述符欧募。
圖9:可視化方向梯度直方圖
openCV【實(shí)踐系列】2——OpenCV方向梯度直方圖
https://bbs.easyaiforum.cn/thread-672-1-1.html
(出處: 易學(xué)智能)