SUSAN角点检测

Posted luo1873626242

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SUSAN角点检测相关的知识,希望对你有一定的参考价值。

close all;
clear all;
I=imread(\'corner2.gif\');
[posX,posY]=susan(I,3);
figure;
imshow(I);hold on;
plot(posX,posY,\'g*\');
View Code
function [posX,posY]=susan(I,radius)
%SUSAN角点检测
%I:输入图像
%radius:圆形模板的半径
%(posX,posY):角点坐标
[r,c]=size(I);
mask=generatemask(radius);
th1=20;%阈值越小,提取的角点越多
th2=sum(mask(:))/2;%阈值越大,提取的角点越多
R=zeros(r,c);%角点响应值
res=zeros(r,c);%是否是角点
for i=radius+1:r-radius
    for j=radius+1:c-radius
        B=I(i-radius:i+radius,j-radius:j+radius);
        usan=(abs(B-I(i,j))<th1).*mask;%USAN区域
        N=sum(usan(:));
        if(N<th2)
            R(i,j)=th2-N;
        end
    end
end

%非极大值抑制
tr=radius+2;
for i=tr+1:r-tr
    for j=tr+1:c-tr
        tmp=R(i-tr:i+tr,j-tr:j+tr);
        tmp(tr+1,tr+1)=0;
        if(R(i,j)>max(tmp(:)))
            res(i,j)=1;
        end
    end
end
[posY,posX]=find(res);

function mask=generatemask(radius)
%生成半径为radius的掩模
mask=zeros(2*radius+1,2*radius+1);
[row,col]=size(mask);
cenr=(row+1)/2;
cenc=(col+1)/2;
for i=1:row
    for j=1:col
        if((i-cenr)^2+(j-cenc)^2<=radius^2)
            mask(i,j)=1;
        end
    end
end
View Code

结果:

以上是关于SUSAN角点检测的主要内容,如果未能解决你的问题,请参考以下文章

OpenCV角点检测源代码分析(Harris和ShiTomasi角点)

角点检测 基于matlab GUI图像角点检测含Matlab源码 2082期

角点检测 基于matlab GUI图像角点检测含Matlab源码 2082期

OpenCV——Harris角点检测

OpenCV亚像素级的角点检测

OpenCV ⚠️高手勿入! 半小时学会基本操作 23⚠️ 角点检测