通常來講,圖像匹配的重要的兩個步驟就是尋找興趣點和肯定描述子信息。數組
如下是經過Harris角點檢測的方法來檢測興趣點app
1 #Harris角點檢測實現 2 from scipy.ndimage import filters 3 import numpy as np 4 from matplotlib import pyplot as plt 5 def compute_harris_response(im,sigma=3): 6 """ 7 在一幅灰度圖像中,對每個像素計算Harris角點檢測器響應函數 8 :param im: 圖像數組 9 :param sigma: 高斯濾波器的參數 10 :return: 商數指示器 11 """ 12 #計算x,y方向上的導數 13 imx=np.zeros(im.shape) 14 filters.gaussian_filter(im,(sigma,sigma),(0,1),imx) 15 imy=np.zeros(im.shape) 16 filters.gaussian_filter(im,(sigma,sigma),(1,0),imy) 17 #計算Harris矩陣的份量 18 wxx=filters.gaussian_filter(imx*imx,sigma) 19 wyy=filters.gaussian_filter(imy*imy,sigma) 20 wxy=filters.gaussian_filter(imx*imy,sigma) 21 #計算特徵值和跡 22 wdet=wxx*wyy-wxy**2 23 wtr=wxx+wyy 24 return wdet/wtr 25 def get_harris_points(harrisim,min_dst=10,threshold=0.2): 26 """ 27 28 :param harrisim: 像素值爲Harris響應函數值的圖像 29 :param min_dst: 分割角點和圖像的最小像素數目 30 :param threshold: 閥值 31 :return: 角點集合 32 """ 33 #尋找高於閥值的候選角點 34 corner_threshold=harrisim.max()*threshold 35 #大於閥值的harris響應函數值被認爲是可能的角點,並在harrism_t矩陣中相應的位置1,其他地方置0 36 harrisim_t=(harrisim>corner_threshold)*1 37 #獲得候選角點的座標 38 coords=np.array(harrisim_t.nonzero()).T 39 40 #獲得候選點的響應值 41 candidate_values=[harrisim_t[c[0],c[1]] for c in coords] 42 #對候選點按照harris響應值進行排序 43 index=np.argsort(candidate_values) 44 #將可行點的位置保存在數組allowed_locations中 45 allowed_locations=np.zeros(harrisim.shape) 46 #爲了確保××××步可以實現 47 allowed_locations[min_dst:-min_dst,min_dst:-min_dst]=1 48 #按照min_distance原則,選擇最佳harris點 49 filtered_coords=[] 50 for i in index: 51 if allowed_locations[coords[i,0],coords[i,1]]==1.0: 52 filtered_coords.append(coords[i]) 53 allowed_locations[(coords[i][0]-min_dst):(coords[i][0]+min_dst),(coords[i][1]-min_dst):(coords[i][1]+min_dst)]=0 54 return filtered_coords 55 56 #繪製圖像中檢測到的角點 57 def plot_harris_points(image,filterd_coords): 58 plt.figure() 59 plt.gray() 60 plt.imshow(image) 61 plt.plot([p[1] for p in filterd_coords],[p[0] for p in filterd_coords],'*') 62 plt.axis('off') 63 plt.show()
下圖爲經過Harris角點檢測方法獲得的結果函數