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 中 c,d,e),当模板中心
处于角点位置时,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<g R(i,j) = g-nmax; else R(i,j) = 0; end end end image_out=R(4:c-4,4:d-4);
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);