圖片物體偵測
需要使用的演算法:
-
方向梯度圖譜 HOG(Histogram of Oriented Gradients)
-
影像金字塔 Image pyramids
-
窗格滑移 Sliding windows
方向梯度圖譜 HOG(Histogram of Oriented Gradients)
影像金字塔 Image pyramids
窗格滑移 Sliding windows
方向梯度圖譜 HOG(Histogram of Oriented Gradients)
參考資料:
HOG與SIFT, SURF, ORB類似,都做圖片特徵描述 把圖片轉換成HOG的視野(pixel-->cell-->block):
1.計算圖片中每個pixel的梯度大小和角度:
將每個pixel分別對x方向Sobel filter和y方向Sobel filter做conolution,得到圖片在x方向和y方向的微分圖gx和gy
計算每個pixel的梯度大小和角度,若圖片為彩色,則梯度大小為三個channel中最大的那一個,角度則
為梯度最大的那個challel對應的角度
現在每一個pixel都有梯度大小和角度的資訊
2.計算cell內部的HOG:
把圖片切割成很多個cell(下圖中綠色格子為一個cell),每個cell由8*8個pixels組成.
每個cell裡面統計64個pixels在0-180度上的分佈圖譜,每個cell用一個histogram來描述特徵值.統計方式如下圖所示,若角度為10(紅色線),則將這個角度對應的梯度大小一比例分配到0和20的histogram.
若如下圖所示,角度為165度,則將梯度強度依比例分配到160和180(等效為0度)
依此類推對cell內每個pixel做統計histogram.
3. Block Normalization (block只用來做normalization, 不用來描述特徵值)
接下來把cell組成group(可以由任意數目的cell組成).Dalal 和 Triggs發現若要辨識人類,一個block內包含2x2個cell會比較好,group完後就可以組成block-wide vector,每個block-wide vectors內有9*4=36個vextor的histogram,對block內的block-wide vectors做L2 norm,做完normalization後將block向右滑動一格再做一次normlization...以此類推
3. 計算HOG特徵向量
下圖中共有8x16個cell, 而每個cell內的histogram有9個vector特徵值,所以這張圖總共有8x16x9=1152個維度的向量.這個做法有想像是把圖片做PCA降維到1152軸的空間向量.HOG descriptor可以想像是由HOG的視角來看這張圖片,由下圖所示.但是opevCV並沒有視覺化HOG descriptor的函數.HOG descriptor已經包含充足的圖片資訊可以有效地把圖片中物體得特徵值描述出來.
因為HOGdescriptor已經含有充足的資訊,因此我們也可以把HOG做逆向轉換,還原成原來的影像.MATLAB有內建的invertHOG函數可以將HOG descriptor還原成原來的影像,如下圖所示.
影像金字塔 Image pyramids
-
取一張影像
-
縮放影像
-
用高斯模糊來使影像平整
-
如果影像比設定的閥值大則重複第一個步驟
可以使用pyrDown()對圖像做down sampling
語法: img = cv2.pyrDown(cv2.imread("contour.jpg", cv2.IMREAD_UNCHANGED))
Opencv中可以通過函數cv2.pyrDown()和cv2.pyrUp()來構建金字塔。 函數cv2.pyrDown()是從一個高分辨率圖像變成低分辨率圖像的。
cv2.pyrDown()函數接受3個參數: tmp: 當前圖像,初始化為原圖像 src 。 dst: 目的圖像( 顯示圖像,為輸入圖像的一半) Size( tmp.cols/2, tmp.rows/2 ) :目的圖像大小, 既然我們是向下採樣 默認情況下直接輸入需要操作的圖像就可以,他會把圖像按縮小1/4的來處理
取一張影像
縮放影像
用高斯模糊來使影像平整
如果影像比設定的閥值大則重複第一個步驟