zoukankan      html  css  js  c++  java
  • 计算机视觉——图像匹配(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角点检测方法得到的结果

  • 相关阅读:
    JavaScript笔记
    第二个项目总结
    java设计模式-代理模式
    软件设计师-随笔笔记
    java设计模式-单例模式
    java-内部类介绍
    java-初识JVM运行及类加载过程
    java-java动态性之反射,动态编译,动态执行js及动态字节码操作
    java-初识注解Annotation
    java-网络编程入门
  • 原文地址:https://www.cnblogs.com/tangweijqxx/p/8520962.html
Copyright © 2011-2022 走看看