# -*- 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,但该猜想有待验证。