# -*- 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,但該猜想有待驗證。