现在的位置: 首页 > 综合 > 正文

matlab练习程序(SUSAN检测)

2013年10月05日 ⁄ 综合 ⁄ 共 1617字 ⁄ 字号 评论关闭

http://blog.csdn.net/jkhere/article/details/8961221

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

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

代码如下:  

  1. close all;  
  2. clc;  
  3.   
  4. img=imread('i.jpg');  
  5. img=rgb2gray(img);  
  6. imshow(img);  
  7. [m n]=size(img);  
  8. img=double(img);  
  9.   
  10. t=45;   %模板中心像素灰度和周围灰度差别的阈值,自己设置  
  11. usan=[]; %当前像素和周围在像素差别在t以下的个数  
  12. %这里用了37个像素的模板  
  13. for i=4:m-3         %没有在外围扩展图像,最终图像会缩小  
  14.    for j=4:n-3   
  15.         tmp=img(i-3:i+3,j-3:j+3);   %先构造7*7的模板,49个像素  
  16.         c=0;  
  17.         for p=1:7  
  18.            for q=1:7  
  19.                 if (p-4)^2+(q-4)^2<=12  %在其中筛选,最终模板类似一个圆形  
  20.                    %   usan(k)=usan(k)+exp(-(((img(i,j)-tmp(p,q))/t)^6));   
  21.                     if abs(img(i,j)-tmp(p,q))<t  %判断灰度是否相近,t是自己设置的  
  22.                         c=c+1;  
  23.                     end  
  24.                 end  
  25.            end  
  26.         end  
  27.         usan=[usan c];  
  28.    end  
  29. end  
  30.   
  31. g=2*max(usan)/3; %确定角点提取的数量,值比较高时会提取出边缘,自己设置  
  32. for i=1:length(usan)  
  33.    if usan(i)<g   
  34.        usan(i)=g-usan(i);  
  35.    else  
  36.        usan(i)=0;  
  37.    end  
  38. end  
  39. imgn=reshape(usan,[n-6,m-6])';  
  40. figure;  
  41. imshow(imgn)  
  42.   
  43. %非极大抑制  
  44. [m n]=size(imgn);  
  45. re=zeros(m,n);  
  46. for i=2:m-1  
  47.    for j=2:n-1   
  48.         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))]);  
  49.             re(i,j)=1;  
  50.         else  
  51.             re(i,j)=0;  
  52.         end  
  53.    end  
  54. end  
  55.   
  56. figure;  
  57. imshow(re==1);  



原图

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

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

抱歉!评论已关闭.