機器學習進階-圖像特征harris-角點檢測 1.cv2.cornerHarris(進行角點檢測)


1.cv2.cornerHarris(gray, 2, 3, 0.04)  # 找出圖像中的角點

參數說明:gray表示輸入的灰度圖,2表示進行角點移動的卷積框,3表示后續進行梯度計算的sobel算子的大小,0.04表示角點響應R值的α值

角點檢測:主要是檢測一些邊角突出來的點,對於A和B這樣的面上的點而言,一個卷積框在上面移動,框中的基本像素點不發生變化, 對於像C和D邊界點,只有x或者y軸方向上的平移,像素框內的像素會發生偏移,而對於E和F這樣的角點而言,不管是像x軸或者向y軸平移,像素框內的像素都會發生偏移, 就好比圖中的綠色方框一樣

角點檢測的基本原理,使用一個3*3的卷積框,在圖上每一點進行平移操作,對於當前位置,在向上或者向下,向左或者向右平移一個像素點后的,兩個圖像像素點之間的差異,即w表示的是加權值,可以全部都是1,也可以使用高斯卷積,以此對中心點的像素改變做加權

使用一階泰勒展開對I(x+∆x, y+∆y) 進行泰勒展開 等於 I(x, y) + Ix * ∆x + Iy*∆y + o(x, y)  Ix表示∂I(x, y) / ∂x 即該點對x方向上的梯度,同理Iy 

對上述式子進行化解操作

c(x, y, ∆x, ∆y) = (Ix * ∆x + Iy*∆y) ^ 2 

將上述式子進行拆分 c(x, y, ∆x, ∆y) = (Ix * ∆x + Iy*∆y) ^ 2 = [∆x, ∆y] * M * [∆x, ∆y]

那么上述的式子就化解乘了A∆x ^ 2 + 2C*∆x * ∆y +∆y ^ 2 這是一個斜橢圓方程,對M(x, y)進行特征變換, 獲得特征值λ1和λ2,即最終的表示為λ1*∆x ^ 2 + λ2*∆y ^ 2

即對斜橢圓做了一個變化,使得其是一個正橢圓,結果不變

舉例說明,λ1越大,那么x軸的方向上∆x變化,所引起的變化也就越大,即像素的變化越大

 

根據λ1和λ2的對比,我們可以知道x方向和y軸方向的y軸的像素變化情況,因此可以判斷到底是什么邊界

右邊的是角點響應值,用來進行實際的計算

在一個角點附近可能存在多個角點,因此我們需要對角點做一個極大值抑制操作

 代碼:

第一步:讀入圖片

第二步:對圖片進行灰度值變化

第三步:使用cv2.cornerHarris進行角點檢測

第四步:判斷dst > dst.max() * 0.01 的角點在圖上進行標紅

# cv2.cornerHarris()
import cv2

# 進行角點檢測
# 第一步:讀取圖片
img = cv2.imread('test_1.jpg')
# 第二步:進行灰度化
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
# 第三步:進行角點檢測
dst = cv2.cornerHarris(gray, 2, 3, 0.04)
# 第四步:進行畫圖秒點操作
img[dst > 0.01*dst.max()] = (0, 0, 255)
cv2.imshow('img', img)
cv2.waitKey(0)
cv2.destroyAllWindows()


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM