角點檢測的原理是基于局部的小窗口完成的,如果該窗口各個方向上移動,窗口內灰度都發生很大變化,即認為發現角點。如果僅在一個方向上變化,其他方向不變,即認為發現邊界。在實現過程中,主要分為四個步驟:(1)計算影像在X與Y方向的梯度,一般采用高斯導數求解;(2)計算影像在兩個方向的乘機,并進行高斯加權;(3)計算每個像素點Harris響應值。并設定閾值。(4)進行非最大值抑制。本算法,只進行了前三部,作出粗略結果,僅供參考。
# -*- coding:utf-8 -*-import numpyfrom PIL import Imagefrom pylab import *from scipy.ndimage import filtersI=array(Image.open('123.jpg').convert('L'))m,n=I.shapeIx=zeros(I.shape)Iy=zeros(I.shape)filters.gaussian_filter(I,(3,3),(0,1),Ix)#邊緣提取filters.gaussian_filter(I,(3,3),(1,0),Iy)Ixx=multiply(Ix,Ix)Iyy=multiply(Iy,Iy)Ixy=multiply(Ix,Iy)Wxx=filters.gaussian_filter(Ixx,3)#高斯模糊Wyy=filters.gaussian_filter(Iyy,3)Wxy=filters.gaussian_filter(Ixy,3)M=zeros([2,2])R=zeros(I.shape)for i in range(m): for j in range(n): M[0,0]=Wxx[i,j] M[1,0]=Wxy[i,j] M[0,1]=Wxy[i,j] M[1,1]=Wyy[i,j] R[i,j]=det(M)-0.06*(trace(M)**2)coord1=[]coord2=[]for i in range(m): for j in range(n): if R[i,j]>3000: coord1.append(i) coord2.append(j)figure()Im=Image.fromarray(I)imshow(I,cmap='gray')plot(coord2,coord1,'r*')axis('off')show()
新聞熱點
疑難解答