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()