本文将从Harries角点检测的原理出发,讲述怎么用matlab一步步实现Harris角点检测算法。算法
matlab能够用corner直接调用Harris角点检测算法,但为了学习如何提取特征点,本文用matlab将其实现,纯粹出于学习目的。因为harris角点特征点相对比较简单,容易实现,这位学习别的特征点检测打下基础。程序中出现的定常数均采用Matlab中corner实现该算法时的默认值。函数
在实现的过程当中,主要是参考了Chris Harris & Mike Stephens在1988年发表的那篇文章A COMBINED CORNER AND EDGE DETECTOR。学习
本文一部分图像及公式来源于百度文库的一篇PPT:Harris角点检测,可自行检索得到。测试
转载请注明出处:http://blog.csdn.net/u010278305spa
本文涉及到的知识点以下:.net
一、高斯卷积。设计
二、Harris角点检测。code
程序设计流程以下:blog
一、先将论文涉及该算法的主要部分给出截图:ci
设计程序时,首先要完成论文的这一部分,计算出A、B、C。
二、运用高斯窗对其进行滤波。
高斯函数以下:
用matlab生成一个高斯卷积核的方法:
h=fspecial('gaussian',[5 1],1.5); w=h*h';
三、遍历图像的每一点,求其M矩阵,并计算出R(以后用于判断是不是角点)。
M矩阵为:
R的计算方法为:
4、判断是不是角点。
若是R大于0且大于Q*RMax,则认为它是角点,RMax为R的最大值,Q为一个常数系数。
五、对角点进行筛选。只有在8邻域内是最大值的店才会被认为是角点。
下面给出源代码:
%function: % Harris角点检测 %注意: % matlab自带的corner函数便可实现harris角点检测。但考虑到harris角点的经典性,本程序将其实现,纯粹出于学习目的,了解特征点检测的方法。 % 其中全部参数均与matlab默认保持一致 %referrence: % Chris Harris & Mike Stephens,A COMBINED CORNER AND EDGE DETECTOR %date:2015-1-11 %author:chenyanan %转载请注明出处:http://blog.csdn.net/u010278305 %清空变量,读取图像 clear;close all src= imread('images/girl.jpg'); gray=rgb2gray(src); gray = im2double(gray); %缩放图像,减小运算时间 gray = imresize(gray, 0.2); %计算X方向和Y方向的梯度及其平方 X=imfilter(gray,[-1 0 1]); X2=X.^2; Y=imfilter(gray,[-1 0 1]'); Y2=Y.^2; XY=X.*Y; %生成高斯卷积核,对X二、Y二、XY进行平滑 h=fspecial('gaussian',[5 1],1.5); w=h*h'; A=imfilter(X2,w); B=imfilter(Y2,w); C=imfilter(XY,w); %k通常取值0.04-0.06 k=0.04; RMax=0; size=size(gray); height=size(1); width=size(2); R=zeros(height,width); for h=1:height for w=1:width %计算M矩阵 M=[A(h,w) C(h,w);C(h,w) B(h,w)]; %计算R用于判断是不是边缘 R(h,w)=det(M) - k*(trace(M))^2; %得到R的最大值,以后用于肯定判断角点的阈值 if(R(h,w)>RMax) RMax=R(h,w); end end end %用Q*RMax做为阈值,判断一个点是否是角点 Q=0.01; R_corner=(R>=(Q*RMax)).*R; %寻找3x3邻域内的最大值,只有一个交点在8邻域内是该邻域的最大点时,才认为该点是角点 fun = @(x) max(x(:)); R_localMax = nlfilter(R,[3 3],fun); %寻找既知足角点阈值,又在其8邻域内是最大值点的点做为角点 %注意:须要剔除边缘点 [row,col]=find(R_localMax(2:height-1,2:width-1)==R_corner(2:height-1,2:width-1)); %绘制提取到的角点 figure('name','Result'); subplot(1,2,1),imshow(gray),title('my-Harris'), hold on plot(col,row, 'b*'), hold off %用matlab自带的edge函数提取Harris角点,对比效果 C = corner(gray); subplot(1,2,2),imshow(gray),title('matlab-conner'), hold on plot(C(:,1), C(:,2), 'r*'); hold off
下面给出本程序运行效果与matlab的corner运行效果的对比图:
测试文件你能够仔细选取,或者在以前发布的博客中找到。
转载请注明出处:http://blog.csdn.net/u010278305