您的位置:首页 > 其它

第一个特征点提取算法

2015-11-25 23:49 176 查看


matlab练习程序(Moravec算子)

这个算子算是图像历史上第一个特征点提取算法了,1977年提出的,很简单,拿来练手很合适。

算法原理如下:

1.选取一个合理的邻域遍历图像,这里是5*5邻域的。在邻域中依次计算,垂直,水平,对角与反对角四个相邻像素灰度的差的平方和,作为该邻域特征值。

大致就是下面这个样子:



公式:









这里k是窗口的半径。
2.从四个特征值中选最小的值作为该像素初次候选特征值。
公式:



 
3.设定一个阈值,将大于该阈值初次候选特征值的选为二次候选特征值。
4.设定一个邻域,将该邻域最大的二次候选特征值作为最终要选择的特征值。
原图:



处理后:



matlab代码如下:

clear all;close all;clc

img=double(imread('lena.jpg'));
[h w]=size(img);
imshow(img,[])

imgn=zeros(h,w);
n=4;
for y=1+n:h-n
for x=1+n:w-n
sq=img(y-n:y+n,x-n:x+n);
V=zeros(1,4);
for i=2:2*n+1        %垂直,水平,对角,反对角四个方向领域灰度差的平方和
V(1)=V(1)+(sq(i,n+1)-sq(i-1,n+1))^2;
V(2)=V(2)+(sq(n+1,i)-sq(n+1,i-1))^2;
V(3)=V(3)+(sq(i,i)-sq(i-1,i-1))^2;
V(4)=V(4)+(sq(i,(2*n+1)-(i-1))-sq(i-1,(2*n+1)-(i-2)))^2;
end
pix=min(V);          %四个方向中选最小值
imgn(y,x)=pix;
end
end

T=mean(imgn(:));        %设阈值,小于均值置零
ind=find(imgn<T);
imgn(ind)=0;

for y=1+n:h-n           %选局部最大且非零值作为特征点
for x=1+n:w-n
sq=imgn(y-n:y+n,x-n:x+n);
if max(sq(:))==imgn(y,x) && imgn(y,x)~=0
img(y,x)=255;
end
end
end

figure;
imshow(img,[]);


算法整个过程还是很简单的,练习一下,顺便祭下这个特征值开山算法。

分类: Matlab练习程序

文章来源:http://www.cnblogs.com/tiandsp/p/4823837.html
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  特征点