📄 susancorner.m
字号:
%********************************************************************
%
% Susan Feature Detector
% Code by Li Weiming@NLPR CASIA 2006.10.26
% Contact Information: wmli@nlpr.ia.ac.cn
%
%********************************************************************
function [cim,cout] = SusanCorner(im,SmlrGate,WinSz,radius,thresh,flag_show);
im = double( im );
[m,n] = size(im);
% calculate usan
circleTemplate = ComputeCircleTemplate(WinSz);
usan = zeros(m,n);
for i = WinSz+1:m-WinSz
for j = WinSz+1:n-WinSz
count = 0;
ImPatch = im(i-WinSz:i+WinSz,j-WinSz:j+WinSz);
ImPatch = ImPatch.*circleTemplate;
CenterValue = im(i,j);
count = sum( sum( abs(ImPatch-CenterValue)< SmlrGate ) );
usan(i,j) = count;
end
end
%
Nmax = sum(circleTemplate(:));
gate = Nmax/2;
usan = gate-usan;
usan = usan.*(usan > 0);
% locate the corner points: find maximum in usan
g_thresh = gate*thresh;
sze = 2*radius+1; % Size of mask.
mx = ordfilt2(usan,sze^2,ones(sze)); % Grey-scale dilate.
cim = (usan == mx) & (usan > g_thresh); % Find maxima.
[r,c] = find(cim); % Find row,col coords.
cout = [r,c];
if flag_show
figure;imshow(im,[]);
hold on;
plot(c,r,'r+'), title('corners detected');
hold off;
end
function circleTemplate = ComputeCircleTemplate(WinSz);
nN = 2*WinSz+1;
circleTemplate = zeros(nN,nN);
for i = 1:nN
for j = 1:nN
x = i - WinSz;
y = j - WinSz;
if x*x + y*y <= WinSz*WinSz
circleTemplate(i,j) = 1;
end
end
end
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -