一,角點
算法流程
- 1.利用水平,豎直差分算子對圖像的每個像素進行濾波以求得Ix,Iy,進而求得M中的四個元素的值。
代碼中如果窗口數組array為-1,0,1,-1,0,1,-1,0,1}則是求解X方向的,如果為{-1,-1,-1,0,0,0,1,1,1}為Y方向的,則Ix和Iy求解結束,求解IX2相對比較簡單,像素相乘即可。
- 2.對M的四個元素進行高斯平滑濾波,為的是消除一些不必要的孤立點和凸起,得到新的矩陣M。
- 3.3.接下來利用M計算對應每個像素的角點響應函數R,即:
- 4、局部極大值抑制,同時選取其極大值
- 5.在矩陣R中,同時滿足R(i,j)大於一定閾值threshold和R(i,j)是某領域內的局部極大值,則被認為是角點
三,代碼
1 from pylab import * 2 from PIL import Image 3 from PCV.localdescriptors import harris 4 """ 5 Example of detecting Harris corner points (Figure 2-1 in the book). 6 """ 7 # 讀入圖像 8 im = array(Image.open(r'b3.jpg').convert('L')) 9 # 檢測harris角點 10 harrisim = harris.compute_harris_response(im) 11 # Harris響應函數 12 harrisim1 = 255 - harrisim 13 figure() 14 gray() 15 #畫出Harris響應圖 16 subplot(141) 17 imshow(harrisim1) 18 print (harrisim1.shape) 19 axis('off') 20 axis('equal') 21 threshold = [0.01, 0.05, 0.1] 22 for i, thres in enumerate(threshold): 23 filtered_coords = harris.get_harris_points(harrisim, 6, thres) 24 subplot(1, 4, i+2) 25 imshow(im) 26 print (im.shape) 27 plot([p[1] for p in filtered_coords], [p[0] for p in filtered_coords], '*') 28 axis('off') 29 show()
四,運行結果
4.1紋理平坦的圖
4.1.1正面
4.1.2側面
4.1.3旋轉
4.1.4相對較遠處
4.1.5較亮情況
4.2垂直或水平邊緣多
4.2.1正面
4.2.2側面
4.2.3旋轉
4.2.4相對較遠處
4.3紋理角點豐富
4.3.1正面
4.3.2側面
4.3.3旋轉
4.3.4相對較遠處
五,結論以及實驗中遇到的問題
5.1實驗結果分析
1. Harris角點具有旋轉不變性。
Harris角點檢測通過窗口對應的二階矩陣M 的特征值得到角點響應值R,從而判斷角點。當圖像轉動時,角點區域的像素點梯度坐標和擬合橢圓對應地發生旋轉,但是矩陣的特征值(也可以理解為數據點區域的擬合橢圓)不變,因此圖像旋轉不影響角點的檢測。
2. Harris角點檢測算子對亮度和對比度的變化不靈敏
這是因為在進行Harris角點檢測時,使用了微分算子對圖像進行微分運算,而微分運算對圖像密度的拉升或收縮和對亮度的抬高或下降不敏感。換言之,對亮度和對比度的仿射變換並不改變Harris響應的極值點出現的位置,但是,閾值的選擇可能會影響角點檢測的結果。
3. Harris角點檢測算子不具有尺度不變性
當圖像被縮小或放大時,在檢測窗口尺寸不變的前提下,在窗口內所包含圖像的內容是完全不同的,角點檢測的性能也會發生改變。
5.2實驗中遇到的問題
PCV,是一個很老的包了,從下載地址:https://github.com/jesolem/PCV (原鏈接,適用於python2),但在python3的時代里已不適用。需要將原文件里的多個print語句改寫成python3的形式才能正常安裝。