susan算子的运用

SUSAN 算法

     1997 年英国牛津大学的 S.M.smith  J.M.Brady 人提出了一种用于低层次图像

处理的最小核值相似区(即 Smallest Univalue Segment Assimilating Nucleus,简称SUSAN)算法[65,66]。它直接对图像灰度值进行操作,方法简单,无需梯度运算,

保证了算法的效率;定位准确,对多个区域的结点也能精确检测;并且具有积分

特性,对局部噪声不敏感,抗噪能力强。

   SUSAN 准则的原理如图 所示,用一个圆形模板遍历图像,若模板内其他

任意像素的灰度值与模板中心像素(核)的灰度值的差小于一定阈值,就认为该

点与核具有相同(或相近)的灰度值,满足这样条件的像素组成的区域称为核值

相似区(Univalue Segment Assimilating Nucleus, USAN)。把图像中的每个像素与

具有相近灰度值的局部区域相联系是 SUSAN 准则的基。

具体检测时,是用圆形模板扫描整个图像,比较模板内每一像素与中心像素

的灰度值,并给定阈值来判别该像素是否属于 USAN 区域,如下式:

式中,c(r,r0)为模板内属于 USAN 区域的像素的判别函数,I (r0)是模板中心

像素(核)的灰度值,I (r)为模板内其他任意像素的灰度值,t是灰度差门限。它

影响检测到角点的个数。t减小,获得图像中更多精细的变化,从而给出相对较多

的检测数量。门限t必须根据图像的对比度和噪声等因素确定。

则图像中某一点的 USAN 区域大小可由下式表示:

sUSAN 区域包含了图像局部许多重要的结构信息,它的大小反映了图像局部

特征的强度,当模板完全处于背景或目标中时,USAN 区域最大(如图 2.6  a),

当模板移向目标边缘时,USAN 区域逐渐变小(如图 2.6  cde),当模板中心

处于角点位置时,USAN 区域很小(如图 2.6  b)。得到每个像素对应的 USAN

区域大小后,利用下式产生初始角点响应:

其中,g 为几何门限,影响检测到的角点形状, g 越小,检测到的角点越尖锐

(1) t , g的确定

    门限g决定了输出角点的USAN区域的最大值,·即只要图象中的象素具有比g

小的USAN区域,该点就被判定为角点。g的大小不但决定了可从图象中提取角点

的多寡,而且如前所述,它还决定了所检测到的角点的尖锐程度。所以一旦确定了

所需角点的质量(尖锐程度)g就可以取一个固定不变的值。门限t表示所能检测

角点的最小对比度,也是能忽略的噪声的最大容限。它主要决定了能够提取的特征

数量,t越小,可从对比度越低的图象中提取特征,而且提取的特征也越多。因此

对于不同对比度和噪声情况的图象,应取不同的t值。

SUSAN 准则有一个突出的优点,就是对局部噪声不敏感,抗噪能力强。这是

由于它不依赖于前期图像分割的结果,并避免了梯度计算,另外,USAN 区域是

由模板内与模板中心像素具有相似灰度值的像素累加而得,这实际上是一个积分

过程,对于高斯噪声有很好的抑制作用。

SUSAN 二维特征检测的最后一个阶段,就是寻找初始角点响应的局部最大值,

也就是非最大抑制处理,以得到最终的角点位置。非最大抑制顾名思义,就是在

局部范围内,如果中心像素的初始响应是此区域内的最大值,则保留其值,否则

删除,这样就可以得到局部区域的最大值。

 matlab 代码:

 im=imread('xinglong.jpg');
>> image_out = susan(im,0.25);

function image_out = susan(im,threshold)
% 功能:实现运用SUNSAN算子进行边缘检测
% 输入:image_in-输入的待检测的图像
%       threshold-阈值
% 输出:image_out-检测边缘出的二值图像

% 将输入的图像矩阵转换成double型
d = length(size(im));
if d==3
    image=double(rgb2gray(im));
elseif d==2
    image=double(im);
end
 
% 建立SUSAN模板
 
mask = ([ 0 0 1 1 1 0 0 ;0 1 1 1 1 1 0;1 1 1 1 1 1 1;1 1 1 1 1 1 1;1 1 1 1 1 1 1;0 1 1 1 1 1 0;0 0 1 1 1 0 0]);  
 
R=zeros(size(image));
% 定义USAN 区域
nmax = 3*37/4;

 [a b]=size(image);
new=zeros(a+7,b+7);
[c d]=size(new);
new(4:c-4,4:d-4)=image;
  
for i=4:c-4
    
    for j=4:d-4
        
        current_image = new(i-3:i+3,j-3:j+3);
        current_masked_image = mask.*current_image;
   
%   调用susan_threshold函数进行阈值比较处理
                
        current_thresholded = susan_threshold(current_masked_image,threshold);
        g=sum(current_thresholded(:));
        
        if nmax

function thresholded = susan_threshold(image,threshold)
% 功能:设定SUSAN算法的阈值

[a b]=size(image);
intensity_center = image((a+1)/2,(b+1)/2);
 
temp1 = (image-intensity_center)/threshold;
temp2 = temp1.^6;
thresholded = exp(-1*temp2);


你可能感兴趣的:(图像处理的算子)