图像特征描述子——Susan

1、Susan:
SUSAN(Smallest Univalue Segment Assimilating NucleusSUSAN)算子的模板和常规卷积算法的正方形模板不同,它使用一种近似圆形的模板。
在这里插入图片描述

该方法可用于一次性快速检测出角点、交点、边缘点,而且无方向性。
(1)susan算法思想:
SUSAN算法采用圆形模板,其目的是使检测达到各向同性。在实际应用中,由于图像的数字化,无法实现真正的原型模板,往往采用近似圆代替。圆形模板在图像上使用,模板内部每个图像像素点的灰度与模板中心像素的灰度进行比较。若模板内某个像素的灰度与模板中心像素灰度的差值小于一定值,则认为该点与核具有相同或相似的灰度。
由满足这样条件的像素组成的区域称为吸收核同值区(Univalue Segment Assimilation Nucleus,USAN);
当圆形模板完全在背景或目标中时,USAN区面积最大;
当圆形模板向边缘移动时,USAN区面积减少;
当圆心处于边缘时,USAN区面积很小;
当圆心在角点处时,USAN区面积最小;
故将图像每点上的USAN区面积作为该处特征的显著性度量,USAN区面积越小,特征越显著;
在这里插入图片描述

(2)susan算法原理:
①确立模板大小:
采用半径为3个像素共计37个像素的类圆形模板;
模板中心像素是标号为19的点;
在这里插入图片描述

视觉图像:SUSAN算子及其实现
②确定USAN区域:
用这个圆形模板扫描整个图像,模板内部的每个像素的灰度与模板中心像素的灰度进行比较,并且给定阈值,确定像素是否属于USAN区域;

判断方法如下式:
在这里插入图片描述

式中,为USAN判别函数,r0为模板中心点,r为模板内部点;t为灰度差阈值,一般取25;
当然,也可以用平滑的线来代替这种直接的分割方式,这样可以获得更稳定而敏感的结果,虽然计算复杂但是可以通过查找表来获得较快的速度。

![在这里插入图片描述](https://img-blog.csdnimg.cn/20200819001858478.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQ0MTM3NTYw,size_16,color_FFFFFF,t_70#pic_center
在这里插入图片描述
在这里插入图片描述

(3)SUSAN检测的优点:
最突出的一个优点:对局部噪声不敏感、抗噪能力强;
由于USAN特征检测原则不依赖于前期图像分割的结果,避免了梯度计算
(4)SUSAN阈值的分析:
在SUSAN检测中,有两种阈值:
一种用来约束角点的数量;
一种用来约束角点的质量;
当然,一个阈值不能完全做到只影响质量或数量,只会有一个侧重点;
那么,SUSAN中的两个阈值t和g在特征检测中起到一个什么样的作用呢?
很明显,
阈值g是角点质量,尽管也会影响数量,但是相对来说更侧重于影响质量;
例如,g值减小,那么SUSAN会更加侧重于检测到更加“尖锐”的角点;
阈值t是角点数量,当t减小时,会检测到更多的角点;
所以,阈值t可以在不影响角点质量的情况下,控制检测到的角点的数量;
在大多数情况下,设t为25比较合适,如果图像的对比度比较低,可以修改t值以适应变化。
(5)SUSAN算子检测步骤:
①利用圆形模板遍历图像,计算每点处的USAN值。
②设置阈值g,进行阈值化,得到特征信息响应;
③使用非极大值抑制来寻找角点;
【注】:由上面的方式得到的角点,存在很大伪角点。
为了去除伪角点,SUSAN算子可以由以下方法实现:
①计算USAN区域的重心,然后计算重心和模板中心的距离,如果距离较小则不是正确的角点;
②判断USAN区域的重心和模板中心的连线所经过的像素都是否属于USAN区域的像素,如果属于那么这个模板中心的点就是角点。
综上所述,我们基本知道SUSAN角点检测算法。
(6)susan角点检测的C++实现:

#include <iostream>
#include "opencv2/opencv.hpp"
#include "opencv2/highgui/highgui.hpp"

#include <iostream> 
using namespace std;
using namespace cv;
Mat  MySusan(Mat img);

int main(int argc, char **argv)
{
    Mat image1 = imread("../test.jpg", 1);//读取图像
    
    Mat imageGray1,image_2;
    cvtColor(image1,imageGray1,COLOR_RGB2GRAY);//将彩色图转化为灰度图
    image_2=MySusan(imageGray1);
       imshow("image",image_2);
    imwrite("image_1.jpg",image_2);
     waitKey();
    return 0;
}


//susan角点检测
//输入灰度图,输出角点
Mat  MySusan(Mat img)
{ 
     //susan模板

       int OffSetX[37] = { -1, 0, 1,

                              -2,-1, 0, 1, 2,

                              -3,-2,-1, 0, 1, 2, 3,

                              -3,-2,-1, 0, 1, 2, 3,

                              -3,-2,-1, 0, 1, 2, 3,

                              -2,-1, 0, 1, 2,

                              -1, 0, 1 };

 

       int OffSetY[37] = { -3,-3,-3,

                              -2,-2,-2,-2,-2,

                              -1,-1,-1,-1,-1,-1,-1,

                               0, 0, 0, 0, 0, 0, 0,

                               1, 1, 1, 1, 1, 1, 1,

                               2, 2, 2, 2, 2,

                               3, 3, 3 };

 

       int mHeight = img.rows;

       int mWidth = img.cols;

       unsigned char *ucDataImg = (unsigned char *)img.data;

       Mat nImg(img.rows,img.cols,CV_8UC1);

       unsigned char *ucDatanImg = (unsigned char *)nImg.data;

 

       int k,pixelSum,thresh,sameNum;

       for(int i=3;i<mHeight-3;i++)

       {

              for (int j=3;j<mWidth-3;j++)

              {

                     pixelSum = 0;

                     sameNum = 0;

                     for (k=0;k<37;k++)

                     {

                            pixelSum += ucDataImg[(i+OffSetY[k])*mWidth+(j+OffSetX[k])];

                           // thresh = pixelSum/37;//数量
                            thresh = 25;

                            if (abs(ucDataImg[(i+OffSetY[k])*mWidth+(j+OffSetX[k])]-ucDataImg[i*mWidth+j])<=thresh)

                            {

                                   sameNum ++;

                            }

                     }

 

                     if (sameNum<33)//质量34

                     {

                            ucDatanImg[i*mWidth+j] = 0;

                     }

                     else

                     {

                            ucDatanImg[i*mWidth+j] = 255;

                     }

              }

       }

       return nImg;
}


(7)输出结果:
在这里插入图片描述

  • 2
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值