角点检测的原理是基于局部的小窗口完成的,如果该窗口各个方向上移动,窗口内灰度都发生很大变化,即认为发现角点。如果仅在一个方向上变化,其他方向不变,即认为发现边界。在实现过程中,主要分为四个步骤:(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()PRint 'finish'实验结果如下图,本实验未进行非最大值抑制,且设置的阈值5000为根据经验得到,所以结果有待完善。
新闻热点
疑难解答