计算机视觉——图像匹配(1)

一般来说,图像匹配的重要的两个步骤就是寻找兴趣点和确定描述子信息。

以下是通过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角点检测方法得到的结果

原文地址:https://www.cnblogs.com/tangweijqxx/p/8520962.html