SUSAN算子既可以检测角点也可以检测边缘,不过角点似乎比不过harris,边缘似乎比不过Canny。不过思想还是有点意思的。
主要思想就是:首先做一个和原图像等大的目标图像。然后用一个圆形的模板,用模板去遍历原图像每个像素,把模板内的每个像素都和模板中心像素比较,如果灰度小于一个阈值,那么就对目标图像当前和原图像相同位置的像素加一,直到结束。目标图像中在原图像是角点的位置就会取局部极小,所以做一个反向的相减。img=max(img)-img,if img
代码如下:
clear all;
close all;
clc;
img=imread('i.jpg');
img=rgb2gray(img);
imshow(img);
[m n]=size(img);
img=double(img);
t=45; %模板中心像素灰度和周围灰度差别的阈值,自己设置
usan=[]; %当前像素和周围在像素差别在t以下的个数
%这里用了37个像素的模板
for i=4:m-3 %没有在外围扩展图像,最终图像会缩小
for j=4:n-3
tmp=img(i-3:i+3,j-3:j+3); %先构造7*7的模板,49个像素
c=0;
for p=1:7
for q=1:7
if (p-4)^2&#43;(q-4)^2<&#61;12 %在其中筛选&#xff0c;最终模板类似一个圆形
% usan(k)&#61;usan(k)&#43;exp(-(((img(i,j)-tmp(p,q))/t)^6));
if abs(img(i,j)-tmp(p,q))
c&#61;c&#43;1;
end
end
end
end
usan&#61;[usan c];
end
end
g&#61;2*max(usan)/3; %确定角点提取的数量&#xff0c;值比较高时会提取出边缘&#xff0c;自己设置
for i&#61;1:length(usan)
if usan(i)
usan(i)&#61;g-usan(i);
else
usan(i)&#61;0;
end
end
imgn&#61;reshape(usan,[n-6,m-6])&#39;;
figure;
imshow(imgn)
%非极大抑制
[m n]&#61;size(imgn);
re&#61;zeros(m,n);
for i&#61;2:m-1
for j&#61;2:n-1
if imgn(i,j)>max([max(imgn(i-1,j-1:j&#43;1)) imgn(i,j-1) imgn(i,j&#43;1) max(imgn(i&#43;1,j-1:j&#43;1))]);
re(i,j)&#61;1;
else
re(i,j)&#61;0;
end
end
end
figure;
imshow(re&#61;&#61;1);
原图
未进行非极大抑制&#xff0c;似乎就是边缘了
进行极大值抑制后的最后的结果