matlab练习程序(SUSAN检测)

SUSAN算子既可以检测角点也可以检测边缘,不过角点似乎比不过harris,边缘似乎比不过Canny。不过思想还是有点意思的。


  主要思想就是:首先做一个和原图像等大的目标图像。然后用一个圆形的模板,用模板去遍历原图像每个像素,把模板内的每个像素都和模板中心像素比较,如果灰度小于一个阈值,那么就对目标图像当前和原图像相同位置的像素加一,直到结束。目标图像中在原图像是角点的位置就会取局部极小,所以做一个反向的相减。img=max(img)-img,if img<g,这里的g也是自己给定的阈值,我这里取了2*max(img)/3这样的阈值,g越大,得到的点就越多。这步之后角点的值就成为局部极大了。最后进行非极大抑制,去除一些杂点就行了。


代码如下:

clear all;
close all;
clc;

img=imread('i.jpg');
img=rgb2gray(img);
imshow(img);
[m n]=size(img);
img=double(img);

t=45;   %模板中心像素灰度和周围灰度差别的阈值,自己设置
usan=[]; %当前像素和周围在像素差别在t以下的个数
%这里用了37个像素的模板
for i=4:m-3         %没有在外围扩展图像,最终图像会缩小
   for j=4:n-3 
        tmp=img(i-3:i+3,j-3:j+3);   %先构造7*7的模板,49个像素
        c=0;
        for p=1:7
           for q=1:7
                if (p-4)^2+(q-4)^2<=12  %在其中筛选,最终模板类似一个圆形
                   %   usan(k)=usan(k)+exp(-(((img(i,j)-tmp(p,q))/t)^6)); 
                    if abs(img(i,j)-tmp(p,q))<t  %判断灰度是否相近,t是自己设置的
                        c=c+1;
                    end
                end
           end
        end
        usan=[usan c];
   end
end

g=2*max(usan)/3; %确定角点提取的数量,值比较高时会提取出边缘,自己设置
for i=1:length(usan)
   if usan(i)<g 
       usan(i)=g-usan(i);
   else
       usan(i)=0;
   end
end
imgn=reshape(usan,[n-6,m-6])';
figure;
imshow(imgn)

%非极大抑制
[m n]=size(imgn);
re=zeros(m,n);
for i=2:m-1
   for j=2:n-1 
        if imgn(i,j)>max([max(imgn(i-1,j-1:j+1)) imgn(i,j-1) imgn(i,j+1) max(imgn(i+1,j-1:j+1))]);
            re(i,j)=1;
        else
            re(i,j)=0;
        end
   end
end

figure;
imshow(re==1);


原图


未进行非极大抑制,似乎就是边缘了


进行极大值抑制后的最后的结果

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
以下是一个使用Marr-Hildreth算法实现边缘检测Matlab程序: ```matlab % 读入图像 img = imread('lena.jpg'); % 转换为灰度图像 img = rgb2gray(img); % 设定高斯核大小和标准差 sigma = 1.5; kernel_size = 2 * ceil(3 * sigma) + 1; % 创建高斯核 gaussian_kernel = fspecial('gaussian', kernel_size, sigma); % 对图像进行高斯滤波 img_smoothed = conv2(double(img), gaussian_kernel, 'same'); % 设定Laplacian of Gaussian(LoG)核大小和标准差 sigma = 1.5; kernel_size = 2 * ceil(3 * sigma) + 1; % 创建LoG核 [x, y] = meshgrid(-floor(kernel_size/2):floor(kernel_size/2)); log_kernel = (-(x.^2 + y.^2)/(2*sigma^2)) .* exp(-(x.^2 + y.^2)/(2*sigma^2)); % 对图像进行LoG滤波 img_log = conv2(img_smoothed, log_kernel, 'same'); % 找到零交叉点并进行非极大值抑制 [nr, nc] = size(img_log); output = zeros(nr, nc); for i = 2:nr-1 for j = 2:nc-1 neighbors = [img_log(i-1, j-1), img_log(i-1, j), img_log(i-1, j+1), ... img_log(i, j-1), img_log(i, j+1), ... img_log(i+1, j-1), img_log(i+1, j), img_log(i+1, j+1)]; max_val = max(neighbors); min_val = min(neighbors); if img_log(i, j) > 0 if min_val < 0 output(i, j) = 1; end elseif img_log(i, j) < 0 if max_val > 0 output(i, j) = 1; end end end end % 显示边缘检测结果 imshow(output); ``` 这个程序会读入名为lena.jpg的图像,转换为灰度图像,然后使用Marr-Hildreth算法进行边缘检测,并显示结果。你可以根据自己的需要修改图像文件名、高斯核大小和标准差、LoG核大小和标准差等参数。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值