susan角点检测算法

susan角点检测算法SUSAN 算法是 1997 年牛津大学的 Smith 等人提出的一种处理灰度图像的方法 它主要是用来计算图像中的角点特征 SUSAN 算法选用圆形模板 如图 1 所示 将位于圆形窗口模板中心等待检测的像素点称为核心点 核心点的邻域被划分为两个区域 亮度值相似于核心点亮度的区域即核值相似区 UnivalueSegm similatingNu USAN 和亮度值不相似于核心点亮度的区域

       SUSAN算法是1997年牛津大学的Smith等人提出的一种处理灰度图像的方法,它主要是用来计算图像中的角点特征。SUSAN算法选用圆形模板(如图1所示)。将位于圆形窗口模板中心等待检测的像素点称为核心点。核心点的邻域被划分为两个区域:亮度值相似于核心点亮度的区域即核值相似区(Univalue SegmentAs-similatingNueleus,USAN)和亮度值不相似于核心点亮度的区域。

susan角点检测算法

图1 圆形模板

       USAN的典型区域如图2所示。模板在图像上移动时,当圆形模板完全在背景或者目标区域时,其USAN区域最大,如图2(a);当核心在边缘时,USAN区域减少一半,如图2(c);当核心在角点时, USAN区域最小,如图2(d)。基于这一原理, Smith提出了最小核值相似区角点检测算法。


susan角点检测算法


图2 典型区域

SUSAN角点检测算法的具体步骤如下:
(1)在图像上放置一个37个像素的圆形模板,模板在图像上滑动,依次比较模板内各个像素点的灰度与模板核的灰度,判断是否属于USAN区域。判别函数如下:




susan角点检测算法

(2)统计圆形模板中和核心点有相似亮度值的像素个数n(r0)。

susan角点检测算法


其中,D(r0)是以r0为中心的圆形模板区域


(3)使用如下角点响应函数。若某个像素点的USAN值小于某一特定阈值,则该点被认为是初始角点,其中,g可以设定为USAN的最大面积的一半。

susan角点检测算法

(4)对初始角点进行非极值抑制来求得最后的角点。



算法实现如下:

IplImage* SUSAN(IplImage* src) { uchar *data0, *data1, *data2; int same, max, min, thresh; IplImage* img = cvCreateImage(cvGetSize(src), 8, 1); //中间图像 IplImage* dst = cvCreateImage(cvGetSize(src), 8, 1); //结果图像 int height = src->height; int width = src->width; int step = src->widthStep / sizeof(uchar); int channels = src->nChannels; data0 = (uchar*)src->imageData; data1 = (uchar*)img->imageData; data2 = (uchar*)dst->imageData; int g = 18; //核值相似区域中点个数的阈值 //模版 x 和 y的坐标的偏移量 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 }; //求阈值 max = min = data0[0]; for (int i = 0; i < height; i++) { for (int j = 0; j 
  
    max) max = data0[i*step + j]; if (data0[i*step + j] 
    
  





版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/176032.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月26日 下午10:50
下一篇 2026年3月26日 下午10:50


相关推荐

  • python可以自动回收垃圾吗_python3新特性

    python可以自动回收垃圾吗_python3新特性前言现在的高级语言如java,c#等,都采用了垃圾回收机制,而不再像c,c++里,需要用户自己管理内存。自己管理内存及其自由,可以任意申请内存,但这如同一把双刃剑,可能会造成内存泄漏,空指针等bug

    2022年8月6日
    9
  • [Android] Bitmap的内存计算

    本文聚焦的问题1、Bitmap中像素数据占用多大内存?如何计算?2、不同图片来源对内存大小有什么影响?Bitmap bitmap = Bitmap.createBitmap(100,100,Bitmap.Config.ARGB_8888);依然以如此声明一个bitmap为例,参数就决定了bitmap的大小。(以Android 8.0+平台为例,这行代码执行后占用的总内存大小=bitmap在…

    2022年3月11日
    66
  • 龙虾OpenClaw爆火:很多人装了不会用,这个GitHub教程讲透了

    龙虾OpenClaw爆火:很多人装了不会用,这个GitHub教程讲透了

    2026年3月13日
    2
  • androidX_android targetSdkVersion

    androidX_android targetSdkVersionAndroidX简介:Android9.0(APIlevel28)发布时,AndroidX也作为一个新的支持库发布出来了。AndroidX时Jetpack的一部分,它包含了现有的支持库和最新的

    2022年8月6日
    5
  • win32 api函数_c调用webapi接口

    win32 api函数_c调用webapi接口前言如果要在Windows上面写程序,就不得不了解一些Win32Api的使用,Win32Api在C/C++的环境中使用非常的方便,直接调用头文件<Windows.h>使用就行了,但在C#中不会这么简单,需要在指定的模块之中导入想要的Win32,下面我们来学习一下如何在C#之中使用Win32Api…在测试Win32Api之前,我先教大家如何获取有窗口的进程信息,代码如下:有窗口的进程,它的窗口句柄不会为0,所以我们只需在所有运行的程序之中判断一.

    2022年10月11日
    5
  • java 哈希码

    java 哈希码哈希码产生的依据 哈希码并不是完全唯一的 它是一种算法 让同一个类的对象按照自己不同的特征尽量的有不同的哈希码 但不表示不同的对象哈希码完全不同 也有相同的情况 看程序员如何写哈希码的算法

    2026年3月17日
    2

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号