Moravec算子在4个方向上计算非归一化的影像局部灰度差方差,将最小值作为兴趣值的测度。该算子检测的特征点是那些影响强度值在每个方向上变化剧烈的点。
步骤:1、计算各像素的兴趣值
2、选出候选点(给定一经验阈值,将兴趣值大于该阈值的点作为候选点)。
3、选取候选点中兴趣值极大的点作为特征点
代码如下:
function N=moravec(filename,G) F=imread(filename); %导入图像 M=rgb2gray(F); %转为灰度图像 figure(1); imshow(M); [row,col]=size(M); N=zeros(row,col); w=5; %5x5的窗口 k=floor(w/2); %k值,向下取整 for i=3:row-3 for j=3:col-3 for d=i-k:i+k %在5x5的窗口中进行计算 for e=j-k:j+k for x=-k:k-1 %第一步:计算各像素的兴趣值 v1=(M(i,j+x)-M(i,j+x+1))^2; %横向 V1=sum(v1); v2=(M(i+x,j+x)-M(i+x+1,j+x+1))^2; %捺向 V2=sum(v2); v3=(M(i+k,j)-M(i+k+1,j))^2; %竖向 V3=sum(v3); v4=(M(i-x,j+x)-M(i-x-1,j+x+1))^2; %撇向 V4=sum(v4); D=[V1,V2,V3,V4]; IV=min(min(D)); %找出最小的值 if IV>G %第二步:给定的经验阈值 M(d,e)=255; %符合条件的像素让它呈现白色 N(i,j)=IV; end end end end end end figure(2); imshow(M); figure(3); imshow(N); Q=zeros(row,row); for h=1:row %在一定窗口选兴趣值最大的点作为特征点 for l=1:col for d=i-k:i+k %在5x5的窗口中进行计算 for e=j-k:j+k Q(d,e)=N(d,e); MAX=max(max(Q)); if N(d,e)<MAX&&N(d,e)~=0 N(h,l)=0; end end end end end figure(4); imshow(N); end
运行结果:
注:代码可能有点烦,有能力的同学可以自己该一下。
Moravec的缺点需要注意以下:
1、对影像边缘部分的检测较敏感
2、影像旋转时,会产生一定的重复点
3、容易受噪声的影像