基于matlab的SUSAN特征检测实现

版权声明:转载请注明出处(作者:Ephemeroptera) https://blog.csdn.net/Ephemeroptera/article/details/83993881

大家好,我是蜉蝣,今天给大家带来的是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 delta<t
               USAN(y,x)=USAN(y,x)+1;  %低于阈值则收纳
           end
       end  
        fprintf(strcat('已处理第','(',num2str(y),',',num2str(x),')','像素点..\n'));
    end
end
toc;
%边缘检测
%
%formula: R(r0) =   g-USAN(r0)  , if USAN(r0)<g
%                    0           ,  otherwise   
%          where g=3/4*max(USAN(:)), USAN越小边缘响应越强,其中角点极小,对应R极大
g=1/2*max(USAN(:));
R=zeros(H,W);
for i=1:size(USAN,1)
    for j=1:size(USAN,2)
        if USAN(i,j)<g
            R(i,j)=g-USAN(i,j);
        else
            R(i,j)=0;
        end
    end
end
BIN=zeros(H,W);
BIN(R>0)=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;

程序实现结果如下:
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/Ephemeroptera/article/details/83993881
今日推荐