matlab中fast特征检测代码,matlab练习程序(FAST特征点检测)

算法思想:如果一个像素与它邻域的像素差别较大(过亮或过暗) , 那它更可能是角点。

算法步骤:

713a225b940c634242ab25c5ed84be1d.png

1.上图所示,一个以像素p为中心,半径为3的圆上,有16个像素点(p1、p2、...、p16)。

2.定义一个阈值。计算p1、p9与中心p的像素差,若它们绝对值都小于阈值,则p点不可能是特征点,直接pass掉;否则,当做候选点,有待进一步考察;

3.若p是候选点,则计算p1、p9、p5、p13与中心p的像素差,若它们的绝对值有至少3个超过阈值,则当做候选点,再进行下一步考察;否则,直接pass掉;

4.若p是候选点,则计算p1到p16这16个点与中心p的像素差,若它们有至少9个超过阈值,则是特征点;否则,直接pass掉。

5.对图像进行非极大值抑制:计算特征点出的FAST得分值(即score值,也即s值),判断以特征点p为中心的一个邻域(如3x3或5x5)内,计算若有多个特征点,则判断每个特征点的s值(16个点与中心差值的绝对值总和),若p是邻域所有特征点中响应值最大的,则保留;否则,抑制。若邻域内只有一个特征点(角点),则保留。

代码如下:

clear all;

close all;

clc;

img=imread('lena.jpg');

imshow(img)

[m n]=size(img);

score=zeros(m,n);

t=60; %阈值

for i=4:m-3

for j=4:n-3

p=img(i,j);

%步骤1,得到以p为中心的16个邻域点

pn=[img(i-3,j) img(i-3,j+1) img(i-2,j+2) img(i-1,j+3) img(i,j+3) img(i+1,j+3) img(i+2,j+2) img(i+3,j+1) ...

img(i+3,j) img(i+3,j-1) img(i+2,j-2) img(i+1,j-3) img(i,j-3) img(i-1,j-3) img(i-2,j-2) img(i-3,j-1)];

%步骤2

if abs(pn(1)-p)

continue;

end

%步骤3

p1_5_9_13=[abs(pn(1)-p)>t abs(pn(5)-p)>t abs(pn(9)-p)>t abs(pn(13)-p)>t];

if sum(p1_5_9_13)>=3

ind=find(abs(pn-p)>t);

%步骤4

if length(ind)>=9

score(i,j) = sum(abs(pn-p));

end

end

end

end

%步骤5,非极大抑制,并且画出特征点

for i=4:m-3

for j=4:n-3

if score(i,j)~=0

if max(max(score(i-2:i+2,j-2:j+2)))==score(i,j)

[img(i-3,j), img(i-3,j+1), img(i-2,j+2), img(i-1,j+3), img(i,j+3), img(i+1,j+3), img(i+2,j+2), img(i+3,j+1), ...

img(i+3,j), img(i+3,j-1), img(i+2,j-2), img(i+1,j-3), img(i,j-3), img(i-1,j-3), img(i-2,j-2), img(i-3,j-1)]= ...

deal(255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255);

end

end

end

end

figure;

imshow(img);

结果如下:

原图:

792f96427f82ee157ee021a4c1b51bdf.png

检测结果:

4258cc104407f5a9bf36eba43d88538e.png

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值