算法思想:如果一个像素与它邻域的像素差别较大(过亮或过暗) , 那它更可能是角点。
算法步骤:
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=; %阈值
for i=:m-
for j=:n-
p=img(i,j);
%步骤1,得到以p为中心的16个邻域点
pn=[img(i-,j) img(i-,j+) img(i-,j+) img(i-,j+) img(i,j+) img(i+,j+) img(i+,j+) img(i+,j+) ...
img(i+,j) img(i+,j-) img(i+,j-) img(i+,j-) img(i,j-) img(i-,j-) img(i-,j-) img(i-,j-)]; %步骤2
if abs(pn()-p)<t && abs(pn()-p)<t
continue;
end %步骤3
p1___=[abs(pn()-p)>t abs(pn()-p)>t abs(pn()-p)>t abs(pn()-p)>t];
if sum(p1___)>=
ind=find(abs(pn-p)>t);
%步骤4
if length(ind)>=
score(i,j) = sum(abs(pn-p));
end
end
end
end %步骤5,非极大抑制,并且画出特征点
for i=:m-
for j=:n-
if score(i,j)~=
if max(max(score(i-:i+,j-:j+)))==score(i,j)
[img(i-,j), img(i-,j+), img(i-,j+), img(i-,j+), img(i,j+), img(i+,j+), img(i+,j+), img(i+,j+), ...
img(i+,j), img(i+,j-), img(i+,j-), img(i+,j-), img(i,j-), img(i-,j-), img(i-,j-), img(i-,j-)]= ...
deal(,,,,,,,,,,,,,,,);
end
end
end
end
figure;
imshow(img);
结果如下:
原图:
检测结果: