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

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