Python基于scipy和PIL的Harris角点检测

来源:互联网 发布:查看数据库字符集 编辑:程序博客网 时间:2024/05/17 22:42

角点检测的原理是基于局部的小窗口完成的,如果该窗口各个方向上移动,窗口内灰度都发生很大变化,即认为发现角点。如果仅在一个方向上变化,其他方向不变,即认为发现边界。在实现过程中,主要分为四个步骤:(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为根据经验得到,所以结果有待完善。


0 0
原创粉丝点击