function lhmSUSAN
close all;
clear all;
%读入图像并显示
data=imread('F:\0.tif');
figure(1);
imshow(data);
data = double(data);
%对图像的每个像素点按照算法计算出新的值,构成一幅新的图像
img_var = zeros(size(data));
t = 100; %t为阈值,衡量模板内的像素点与中心像素强度的差异,t值越大(如25),
%检测出的角点数越少;t值越小,检测出的角点越多。(t与g的区别)
%构造半径为3个像素的圆形模板,当像素位于模板内时,根据公式求c和n(n最大值为37),
%并以n为基础构造一副新的图片。
for ii = 4:size(data,1)-3
for jj = 4:size(data,2)-3
n = 0;
for i=-3:3
for j=-3:3
if abs(i)+abs(j)>4
else
c = exp(-((data(ii+i,jj+j)-data(ii,jj))/t)^6);
n = n + c;
end
end
end
img_var(ii,jj)=n;
end
end
figure(2); %显示结果为边缘图
imshow(uint8(img_var));
g=max(img_var(:))*1/2; %g为阈值,g值越小,检测出的角点数越少;g值越大,检测出的角点数越多
% 判断新图中检测出的线中的角点:角点对应的USAN的面积较小,越小,其响应越大。
img_var2 = zeros(size(img_var));
for ii=4:size(data,1)-3
for jj = 4:size(data,2)-3
if img_var(ii,jj)<g
r = g - img_var(ii,jj);
else
r = 0;
end
img_var2(ii,jj)=r;
end
end
figure(3);%当g=max(img_var(:))*3/4时,图中可显示出细化的边缘
imshow(uint8(img_var2));
im_mixmum = findMixmum(img_var2);%调用 非极大值抑制 函数
%在原图像上叠加角点
[corner_rr,corner_cc]=find(im_mixmum);%find函数表示找出矩阵中的非零值的横坐标\纵坐标;
figure(1);
hold on; %保持图1为当前活动图,hold off之前的操作均在该图上进行;
plot(corner_cc,corner_rr,'r+');%在图1中对应的纵坐标\横坐标处用红色的十字表示检测出的非零值;
hold off;
m = 0;
%确定阈值\进行非极大值抑制(中心点>=周围的所有点)
function im_mixmum = findMixmum(im);
[r,c] = size(im); %计算图像的大小,
im_mixmum = zeros(r,c); %设定一个同等大小的零矩阵
T = 13*mean2(im); %阈值为像素均值的0.5倍;
for i = 3:r-2
for j = 3:c-2
matrixS = im(i-2:i+2,j-2:j+2);
maxV = max(matrixS(:)); %max(matrixS(:)):将矩阵展开为列数组,求其中的最大值;
pp = size(find(matrixS == maxV));
if im(i,j) == maxV & maxV > T & pp == 1
im_mixmum(i,j) = 1; %构造一个5*5的矩阵,若中心值>=周围的值,且该值大于阈值,则为局部极大值;
end
end
end %非极大值抑制:极大值设为1,其他值设为0(这也是先构造一个零矩阵的好处)