moravec算法C语言代码,Moravec算子

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

算法原理如下:

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

大致就是下面这个样子:

0818b9ca8b590ca3270a3433284dd417.png

公式:

0818b9ca8b590ca3270a3433284dd417.png

0818b9ca8b590ca3270a3433284dd417.png

0818b9ca8b590ca3270a3433284dd417.png

0818b9ca8b590ca3270a3433284dd417.png

这里k是窗口的半径。

2.从四个特征值中选最小的值作为该像素初次候选特征值。

公式:

0818b9ca8b590ca3270a3433284dd417.png

3.设定一个阈值,将大于该阈值初次候选特征值的选为二次候选特征值。

4.设定一个邻域,将该邻域最大的二次候选特征值作为最终要选择的特征值。

原图:

0818b9ca8b590ca3270a3433284dd417.png

处理后:

0818b9ca8b590ca3270a3433284dd417.png

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

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,[]);

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值