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
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);