大家好,我是蜉蝣,今天给大家带来的是susan算子的实现过程。
SUSAN算子是一个原理简单、易于了解的算子。由于其指数基于对周边象素的 灰度比较,完全不涉及梯度的运算,因此其抗噪声能力很强,运算量也比较小;同时,SUSAN算子还是一个各向同性的算子;最后,通过控制参数t和g,可以根据具体情况很容易地对不同对比度、不同形状的图像通过设置恰当的t和g进行控制。比如图像的对比度较大,则可选取较大的t值,而图像的对比度较小,则可选取较小的t值。总之,SUSAN算子是一个非常难得的算子,不仅具有很好的边缘检测性能;而且对角点检测也具有很好的效果。
关于SUSAN的检测原理请参考:(https://blog.csdn.net/kezunhai/article/details/11269793)这里不再过多赘述。
接下来带给大家我用matlab对susan算子的实现过程,请看代码;
% detectSUSANFeayures.m Author:Ephemeroptera Date:2018\11\12
% adress:AHU QQ:605686962 Vsesion:1.0.0
%7x7 圆周template的局部地址
% [-1,-3] [0,-3] [1,-3]
% [-2,-2] [-1,-2] [0,-2] [1,-2] [2,-2]
% [-3,-1] [-2,-1] [-1,-1] [0,-1] [1,-1] [2,-1] [3, -1]
% [-3, 0] [-2, 0] [-1, 0] [0, 0] [1, 0] [2, 0] [3 , 0]
% [-3 ,1] [-2, 1] [-1, 1] [0, 1] [1, 1] [2 ,1] [3 , 1]
% [-2, 2] [-1, 2] [0, 2] [1 ,2] [2 ,2]
% [-1 ,3] [0, 3] [1, 3]
%
%formula:c(r,r0)= 1 if |I(r)-I(r0)|<=t;
% 0 if |I(r)-I(r0)|>t;
% USAN(r0)=Σc(r,r0);
%设置圆周模板半径和滑动窗口的步长
radius=3;Xstep=1;Ystep=1;
template=fspecial('disk',radius);
template(template>0.01)=1; %模板二值化
template(template<0.01)=0;
%提取圆周模板的逻辑地址
[tem_x,tem_y]=find(template==1);
tem_x=tem_x-radius-1;
tem_y=tem_y-radius-1;
t=45; %USAN判定阈值
I = imread('cameraman.tif');
W=size(I,2);H=size(I,1); %图像大小
nucleas_X=radius+1:Xstep:W-radius; %模板圆心即nucleas运动范围
nucleas_Y=radius+1:Ystep:H-radius;
USAN=zeros(size(I,1),size(I,2)); %初始化USAN累加器
%网格遍历
tic;
for y=nucleas_Y
for x=nucleas_X
for e=1:length(tem_x) %圆周模板上进行判定
delta=I(y+tem_y(e),x+tem_x(e))-I(y,x);
if delta0)=1;
figure(1),imshow(BIN,[]),title('SUSAN 边缘检测');
%角点检测(非极大值抑制)
corners=[];
for i=2:H-1
for j=2:W-1
if R(i,j)>max([max(R(i-1,j-1:j+1)),R(i,j-1) ,R(i,j+1), max(R(i+1,j-1:j+1))])
corners=[corners;[i,j]];
end
end
end
% I = insertMarker(I,corners);
figure(2);imshow(I);hold on;
set(gca,'xaxislocation','top','yaxislocation','left','ydir','reverse');
scatter(corners(:,2),corners(:,1),'x','g'),title('SUSAN 角点检测');
hold off;