Harris角点检测

# -*- coding: utf-8 -*-
"""
Created on Thu Mar 29 22:29:41 2018

@author: Administrator
"""

from PIL import Image
from pylab import *
from numpy import *
from scipy.ndimage import filters
def compute_harris_response(im,sigma=3):
    #计算导数
    imx=zeros(im.shape)
    filters.gaussian_filter(im,(sigma,sigma),(0,1),imx)
    imy=zeros(im.shape)
    filters.gaussian_filter(im,(sigma,sigma),(1,0),imy)
    #计算harris矩阵的分量
    Wxx=filters.gaussian_filter(imx*imx,sigma)
    Wxy=filters.gaussian_filter(imx*imy,sigma)
    Wyy=filters.gaussian_filter(imy*imy,sigma)
    #计算特征值和迹
    Wdet=Wxx*Wyy-Wxy**2
    Wtr=Wxx+Wyy
    #返回指示器
    return Wdet/Wtr
##############################################
def get_harris_points(harrisim,min_dist=10,threshold=0.1):
    #寻找高于阈值的候选角点
    corner_threshold=harrisim.max()*threshold
    harrisim_t=(harrisim>corner_threshold)*1
    #得到候选角点的座标 nonzero()
    coords=array(harrisim_t.nonzero()).T
    #根据座标得到Harris响应值
    candidate_values=[harrisim[c[0],c[1]] for c in coords]
    #对候选点按照Harris响应值进行排序
    index=argsort(candidate_values)
    #将可行点的位置保存到数组中
    allowed_locations=zeros(harrisim.shape)
    allowed_locations[min_dist:-min_dist,min_dist:-min_dist]=1
    #按照min_distance原则 选择最佳Harris点
    filtered_coords=[]
    for i in index:
        if allowed_locations[coords[i,0],coords[i,1]]==1:
            filtered_coords.append(coords[i])
            allowed_locations[(coords[i,0]-min_dist):(coords[i,0]+min_dist),(coords[i,1]-min_dist):(coords[i,1]+min_dist)]=0
    return filtered_coords
#绘制角点
def plot_harris_points(image,filter_coords):
    figure()
    gray()
    imshow(image)
    plot([p[1] for p in filter_coords],[p[0] for p in filter_coords],'*')
    axis('off')
    show()


im=array(Image.open('test_pic/aa.jpg').convert('L'))
harrisim=compute_harris_response(im)
filtered_coords=get_harris_points(harrisim,6)
plot_harris_points(im,filtered_coords)

以上代码可直接使用
但是我在用自己画的三角形图的时候,无法检测角点,不知道为什么,希望有大神指教。
更新:上述问题仍没得到解决,但现在找到问题所在,经过Harris计算的图像矩阵变成含有nan的矩阵,现不明原因。
更新:问题得到了解决,我在将Harris方法计算出的结果赋给一个变量harrisim,后用方法pic=nan_to_num(harrisim)将nan转化为num,使问题得到了解决。原因我觉得是因为在harris计算时,由于我图片背景多为白色,故会产生0/0的情况而产生nan,但该猜想有待验证。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章