一、相关理论
SUSAN的全名是:(Smallest Univalue Segment Assimilating Nucleus)。它是一种很有特色高效的边缘和角点检测算子,它不仅可以检测图像目标的边界点,而且能够较Robust地检测目标的角点。并且具有结构保留的降噪功能。
阈值的分析
在角点检测中,有两种类型的阈值,一种用来约束角点的数量,另一种用来约束角点的质量。当然,一个阈值不能完全做到只影响质量或数量,只是会有一个侧重点。那么,SUSAN中的两个阈值t和g在角点检测中起到一个什么样的作用呢?很明显,阈值g是角点质量的。尽管也会影响数量,但是相对来说更侧重于影响质量(角点的形状)。例如,g值减小,那么SUSAN会更加侧重于检测到更加“尖锐”的角点。所以,可以更加自己的实际需求来确定阈值g。而阈值t,是角点的数量。当t减小时,会检测到更多的角点。所以,阈值t可以在不影响角点质量的情况下,控制检测到的角点的数量。在大多数情况下,设t为25比较合适,如果图像的对比度比较低,可以修改t值以适应变化。
通过上面对a、b、c、d、e等几个圆形模板的SUSAN值的分析,当模板的中心位于角点处时SUSAN的值最小。
SUSAN算子检测角点的步骤:
利用圆形模板遍历图像,计算每点处的SUSAN值。
设置一阈值g,一般取值为1/2(Max(n), 也即取值为SUSAN最大值的一半,进行阈值化,得到角点响应。
使用非极大值抑制来寻找角点。
通过上面的方式得到的角点,存在很大伪角点。为了去除伪角点,SUSAN算子可以由以下方法实现:
计算SUSAN区域的重心,然后计算重心和模板中心的距离,如果距离较小则不是正确的角点;
判断SUSAN区域的重心和模板中心的连线所经过的像素都是否属于SUSAN区域的像素,如果属于那么这个模板中心的点就是角点。
二、程序
寻找角点
% 运用两个阈值在边缘点中找出角点 thGeo = (nnz(mask)-1)*0.2; thGeo1 = (nnz(mask)-1)*0.4; thGeo2 = (nnz(mask)-1)*0.4; thT = 0.07; thT1 = 0.04; % 读取img第一维的大小,这里为7 sz = size(img,1); % 构建7*7模板,模板像素值均为img中心点的像素大小 usan = ones(sz)*img(round(sz/2),round(sz/2)); % 判断像素相似性,如果相似,则将similar数组此位置置1 similar = (abs(usan-img)<thT); % 将7*7的方形similar模板转换为37像素的圆形模板 similar = similar.*mask; % 计算相似像素总数 res = sum(similar(:)); % 如果相似像素的个数小于阈值thGeo,则有可能是角点、边界点或噪声点 if res < thGeo % 判断是否为角点 dark = nnz((img-usan<-thT1).*mask); bright = nnz((img-usan>thT1).*mask); res = min(dark,bright)<thGeo1 && max(dark,bright)>thGeo2; else res = 0; end end[+wx matlab56,讨论技术问题]