harris角检测器

来源:互联网 发布:linux sqlplus 乱码 编辑:程序博客网 时间:2024/06/06 07:48
from numpy import *from scipy.ndimage.filters import gaussian_filterfrom pylab import *def get_quo(imarray,sigma=3):#sigma为方差    imx=zeros(imarray.shape)    imy=zeros(imarray.shape)    ##计算在x,y方向上的方向上的导数    gaussian_filter(imarray,(sigma,sigma),(0,1),imx)    gaussian_filter(imarray,(sigma,sigma),(1,0),imy)    #计算MI矩阵,----harris矩阵的分量    wxx=gaussian_filter(imx*imx,sigma)    wyy=gaussian_filter(imy*imy,sigma)    wxy=gaussian_filter(imx*imy,sigma)    #计算特征值和迹    det=wxx*wyy-wxy**2#特征值    trace1=wxx+wyy#迹    quo=det/trace1#商数    return quodef get_harris_point(quo,min_dis,threshold=0.1):    '''quo为商数,min_dis为两个角点之间最短的距离,threshold为阈值比'''    conthro=threshold*quo.max()#确定阈值的具体值    harris=1*(quo>conthro)    print(harris.nonzero())    #获取候选坐标    harris_T=array(harris.nonzero()).T    # print(harris_T)    #获取harris的响应值    harris_value=[quo[c[0],c[1]] for c in harris_T]    # print(harris_value)    # 将响应值按从小到大输出其索引值    index=argsort(harris_value)    #将可行点的位置保存在数组中    allow_point=zeros(quo.shape)    allow_point[min_dis:-min_dis,min_dis:-min_dis]=1    #按照给出的min_dis-最短距离原则选择最佳的harris点    filter_point=[]    for i in index:        if allow_point[harris_T[i,0],harris_T[i,1]]==1:            filter_point.append(harris_T[i])            allow_point[harris_T[i,0]-min_dis:harris_T[i,0]+min_dis,harris_T[i,1]-min_dis:harris_T[i,1]+min_dis]=0    return filter_pointdef plot_harris_point(image,filter_point):    figure()    gray()    imshow(image)    plot([p[1] for p in filter_point],[p[0] for p in filter_point],'r*')    axis('off')    show()
from PIL import Imagefrom numpy import *from pylab import *import harris_funim=array(Image.open(r'F:\img_test\t8.jpg').convert('L'))quo=harris_fun.get_quo(im)print(quo)filter_point=harris_fun.get_harris_point(quo,10)harris_fun.plot_harris_point(im,filter_point)
结果显示:


原创粉丝点击