一般来说,图像匹配的重要的两个步骤就是寻找兴趣点和确定描述子信息。
以下是通过Harris角点检测的方法来检测兴趣点
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角点检测方法得到的结果