SUSAN边缘检测算法,及其Matlab和OpenCV实现

2023-11-18

1、SUSAN边缘检测计算步骤
(1)在图像上放置一个37个像素的圆形模板,模板在图像上滑动,依次比较模板内各个像素点的灰度与模板核的灰度,判断是否属于USAN区域。判别函数如下:在这里插入图片描述
其中, r ⃗ 0 {{\vec{r}}_{0}} r 0.表示二维图像中核心点的位置, r ⃗ \vec{r} r 表示模板中其他点的位置, I ( r ⃗ 0 ) I({{\vec{r}}_{0}}) I(r 0)表示图像在 r ⃗ 0 {{\vec{r}}_{0}} r 0处的像素值, I ( r ⃗ ) I(\vec{r}) I(r )表示图像在 r ⃗ \vec{r} r 处的像素值, t t t是表示亮度插值的一个门限值,决定了USAN区域各点之间最大的亮度差值, c c c是一个用来比较输出的函数。也可以用平滑的县来代替这种直接的分割方式,这样可以获得更稳定而敏感的结果,虽然计算复杂,但是可以通过查表来获得较快的速度。公式如下:
c ( r ⃗ , r ⃗ 0 ) = e − ( I ( r ⃗ ) − I ( r ⃗ 0 ) t ) 6 c(\vec{r},{{\vec{r}}_{0}})={{e}^{-{{\left( \frac{I(\vec{r})-I({{{\vec{r}}}_{0}})}{t} \right)}^{6}}}} c(r ,r 0)=e(tI(r )I(r 0))6
(2)统计圆形模板中和核心点有相似亮度值的像素值个数 n ( r 0 ) n({{r}_{0}}) n(r0) n ( r ⃗ 0 ) = ∑ r ⃗ ∈ D ( r ⃗ 0 ) c ( r ⃗ , r ⃗ 0 ) n({{\vec{r}}_{0}})=\sum\limits_{\vec{r}\in D({{{\vec{r}}}_{0}})}{c(\vec{r},{{{\vec{r}}}_{0}})} n(r 0)=r D(r 0)c(r ,r 0)其中, D ( r ⃗ 0 ) D({{\vec{r}}_{0}}) D(r 0)是以 r ⃗ 0 {{\vec{r}}_{0}} r 0为中心的圆形模板区域, n n n是USAN区域中像素的个数。
(3)使用如下角点响应函数,若某个像素点的USAN值小于某一特定阈值,则该点被认为是初始角点。将 n n n同一个固定的阈值 g g g比较(一般设置为最大与中心相似点数 n max ⁡ {{n}_{\max }} nmax的0.75倍左右),初始的边缘响应可以用下面的等式计算:
在这里插入图片描述
(4)对初始边缘进行非极值抑制来求得最后的边缘。(理论上在垂直于边缘的方向上进行非极大值抑制,以细化边缘或拟合亚像素边缘,但这里只进行最简单的非极大值抑制)
2、Matlab实现

%% SUSAN边缘检测算法(不计算边缘方向,只进行最简单的非极大值抑制)
close all
clear
clc

img=imread('board.jpg');
[m,n,c]=size(img);
if c>1
   img_gray=rgb2gray(img);
else
   img_gray=img;
end
img_gray=double(img_gray);
t=45;   % 阈值
g=2*37/3;
R=zeros(m,n);
%% 1、圆形模板在图像上滑动,依次比较模板内各个像素点的灰度与模板核的灰度,判断是否属于USAN区域
for i=4:m-3
   for j=4:n-3
      tmp=img_gray(i-3:i+3,j-3:j+3);
      c=0;  % USAN计数
      %% 2、统计圆形模板中和核心点有相似亮度值的像素值个数
      for p=1:7
         for q=1:7
            if (p-4)^2+(q-4)^2<12
               if abs(img_gray(i,j)-tmp(p,q))<t
                  c=c+1; 
               end
            end
         end
      end
      %% 3、计算边缘响应,确定初始边缘
      if c<g
         R(i,j)=g-c; 
      end
   end
end
%% 4、非极大值抑制
s=5;    % 邻域大小
Re=zeros(m,n);
Rmax=0.02*max(R,[],'all');
for i=4+(s-1)/2:m-3-(s-1)/2
   for j=4+(s-1)/2:n-3-(s-1)/2
      if (R(i,j)==max(R(i-(s-1)/2:i+(s-1)/2,j-(s-1)/2:j+(s-1)/2),[],'all')) && (R(i,j)>Rmax) 
         Re(i,j)=1;
      end
   end
end
[x,y]=find(Re==1);
figure(1)
imshow(img);
hold on
plot(y,x,'r+','MarkerSize',1);
hold off

结果如图所示:
在这里插入图片描述
3、OpenCV实现

// SUSAN边缘检测
#include <iostream>
#include <opencv2\opencv.hpp>

using namespace std;
using namespace cv;

int main()
{
	Mat img = imread("board.jpg");
	Mat img_gray, tmp, R;
	int t = 25;	// USAN阈值
	if (img.channels() > 1)
		cvtColor(img, img_gray, COLOR_BGR2GRAY);
	else
		img_gray = img.clone();
	img_gray.convertTo(img_gray, CV_32FC1);
	Size s = img_gray.size();
	int m = s.height, n = s.width, usan;
	double g = 2 * 37 / 3.0;
	float *p1, *p2, *p3;
	R = Mat::zeros(s, CV_32FC1);

	// 1、圆形模板在图像上滑动,依次比较模板内各个像素点的灰度与模板核的灰度,判断是否属于USAN区域
	for (int i = 3 ; i < m - 3; i++)
	{
		p1 = img_gray.ptr<float>(i);
		p2 = R.ptr<float>(i);
		for (int j = 3; j < n - 3; j++)
		{
			tmp = img_gray(Rect(j - 3, i - 3, 7, 7));
			usan = 0;	// USAN计数			
			// 2、统计圆形模板中和核心点有相似亮度值的像素值个数
			for (int p = 0; p < 7; p++)
			{
				p3 = tmp.ptr<float>(p);
				for (int q = 0; q < 7; q++)
					if ((p - 3)*(p - 3) + (q - 3)*(q - 3) < 12)
						if (fabsf(p1[j] - p3[q]) < t)
							usan = usan + 1;
			}
			// 3、计算边缘响应,确定初始边缘
			if (usan < g)
				p2[j] = g - usan;
		}
	}
	// 4、非极大值抑制
	int s1 = 5, s2;	// 邻域
	Mat Re = Mat::zeros(s, CV_32FC1);
	double Rmax, rmax;
	minMaxIdx(R, NULL, &Rmax, NULL, NULL);
	Rmax = 0.02*Rmax;
	s2 = (s1 - 1) / 2;
	for (int i = 3 + s2; i < m - 3 - s2; i++)
	{
		p2 = R.ptr<float>(i);
		p3 = Re.ptr<float>(i);
		for (int j = 3 + s2; j < n - 3 - s2; j++)
		{
			minMaxIdx(R(Rect(j - s2, i - s2, s1, s1)), NULL, &rmax, NULL, NULL);
			if ((p2[j] == rmax) && (p2[j] > Rmax))
			{
				p3[j] = 255;
				drawMarker(img, Point(j, i), Scalar(0, 0, 255), MARKER_CROSS, 10, 1);
			}
		}
	}
	namedWindow("img", 2);
	imshow("img", img);
	waitKey(0);

	return 0;
}

结果如图所示:
在这里插入图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

SUSAN边缘检测算法,及其Matlab和OpenCV实现 的相关文章

  • 频域和空间域的汉明滤波器

    我想通过在 MATLAB 中应用汉明滤波器来消除一维信号中的吉布斯伪影 我所拥有的是k1这是频域中的信号 我可以通过应用 DFT 来获取时域信号k1 s1 ifft ifftshift k1 该信号具有吉布斯伪影 现在 我想通过 A 乘以汉
  • 作为动画的八度情节点

    我有以下八度脚本 TOTAL POINTS 100 figure 1 for i 1 TOTAL POINTS randX rand 1 randY rand 1 scatter randX randY hold on endfor 当我运
  • 来自连接到远程机器的相机的 Opencv 流

    我正在用 python 开发一个 wx 应用程序 用于流式传输和显示来自两个不同网络摄像头的视频 这工作正常 但现在我需要在不同的场景中执行此操作 其中两个摄像头连接在通过网络连接的 Windows 上运行的单独计算机中 我的应用程序将在机
  • OpenCV 3 中的 FLANN 错误

    我运行的是 Ubuntu 14 04 我正在尝试使用 openCV 3 运行 FLANN 但出现错误 下面的所有内容都是通过使用 AKAZE 和 ORB 进行尝试的 但代码来自我尝试使用 ORB 的情况 我使用 ORB 来查找描述符和关键点
  • 如何将输出视频保存到 OpenCV 中的文件中

    我想将输出视频保存到文件中而不是显示它并尝试使用 cvcaptureimage 但仍然无法获得结果 include
  • 从 imread 返回的 ndims

    我正在从文件夹中选取图像 尺寸为128 128 为此 我使用以下代码行 FileName PathName uigetfile jpg Select the Cover Image file fullfile PathName FileNa
  • BASH 脚本编译多个 C++ 文件 - OpenCV

    请参见在C 和OpenCV中调用其他文件中的函数 https stackoverflow com questions 24442836 call functions in other files in c and opencv 对于最初的问
  • 当我将鼠标移到 Mat 关键字上时,Visual Studio 2017 冻结(OpenCv 3.4.1)

    我想在 Visual Studio 2017 中开发 openCv 项目 我下载了 opencv 预构建库并进行了必要的设置 那是 1 我添加了系统路径 build x64 vc14 bin 2 在 Visual Studio 中的项目属性
  • 在Matlab中选择图像上的像素时,索引指的是什么?

    当在Matlab中查看图像的单个像素时 该索引指的是什么 X Y 指的是像素的坐标 RGB 指的是颜色 但是关于索引是什么有什么想法吗 为了澄清一下 当我在 Matlab 中查看图形并使用数据光标选择一个点时 显示的三行是 X Y 指数 R
  • 垂直子图的单一颜色条

    我想让下面的 MATLAB 图有一个沿着两个子图延伸的颜色条 像这样的事情 使用图形编辑器手动完成 Note 这与提出的问题不同here https stackoverflow com questions 39950229 matlab t
  • 检查图像中是否有太薄的区域

    我正在尝试验证雕刻机的黑白图像 更多的是剪贴画图像 不是照片 我需要考虑的主要事情之一是区域的大小 或线条的宽度 因为机器无法处理太细的线条 所以我需要找到比给定阈值更细的区域 以此图为例 竖琴的琴弦可能太细而无法雕刻 我正在阅读有关 Ma
  • matlab部署工具到java包javac错误

    我正在尝试将我的程序包装为与 java 一起使用 我首先尝试了一个简单的 hello world 你好世界 m disp 你好世界 我使用了deploytool并选择了java包 当它到达这一行时 执行命令 javac verbose cl
  • 动态调整自定义刻度数

    Taking SO 的一个例子 https stackoverflow com a 7139485 97160 我想根据当前视图调整轴刻度 这是默认行为 除非设置自定义的刻度数 下图展示了由此产生的行为 左侧是默认行为 右侧是带有自定义刻度
  • 直方图均衡结果

    I am trying to code histogram equalization by my self but the results are different from the built in function in matlab
  • OpenCV 2.4.3 中的阴影去除

    我正在使用 OpenCV 2 4 3 最新版本 使用内置的视频流检测前景GMG http docs opencv org modules gpu doc video html highlight gmg gpu 3a 3aGMG GPU算法
  • OpenCV 错误:connectedComponents_sub1 中断言失败 (L.channels() == 1 && I.channels() == 1) [关闭]

    Closed 这个问题需要调试细节 help minimal reproducible example 目前不接受答案 我在 OpenCV python 中遇到以下错误 并用 google 搜索了很多 但无法解决 如果有人能为我提供一些线索
  • 2d 图像点和 3d 网格之间的交点

    Given 网格 源相机 我有内在和外在参数 图像坐标 2d Output 3D 点 是从相机中心发出的光线穿过图像平面上的 2d 点与网格的交点 我试图找到网格上的 3d 点 This is the process From Multip
  • 命令 A(~A) 在 matlab 中的真正作用是什么

    我一直在寻找找到矩阵非零最小值的最有效方法 并在论坛上找到了这个 设数据为矩阵A A A nan minNonZero min A 这是非常短且高效的 至少在代码行数方面 但我不明白当我们这样做时会发生什么 我找不到任何关于此的文档 因为它
  • MATLAB 编译器与 MATLAB 编码器

    两者有什么区别 据我了解 MATLAB Compiler将MATLAB代码包装成 exe文件 这样就可以在不安装MATLAB的情况下使用它 并且只需要MCR 除此之外 MATLAB Builder NE 还可以用于生成与 Net 框架一起使
  • 如何使用 opencv python 计算乐高积木上的孔数?

    我正在开发我的 python 项目 我需要计算每个乐高积木组件中有多少个孔 我将从输入 json 文件中获取有关需要计算哪个程序集的信息 如下所示 img 001 red 0 blue 2 white 1 grey 1 yellow 1 r

随机推荐

  • 实战:实现缓存和数据库一致性方案

    原创 微信公众号 阿Q说代码 欢迎分享 转载请保留出处 哈喽大家好 我是阿Q 最近不是正好在研究 canal 嘛 刚巧前两天看了一篇关于解决缓存与数据库一致性问题的文章 里边提到了一种解决方案是结合 canal 来操作的 所以阿Q就想趁热打
  • 中达优控触摸屏编程视频教程_触摸屏组态编程软件

    YKBuilder是一个中达优控触摸屏编程软件 触摸屏组态编程软件在电脑的开始菜单 打开运行对话框 输入 dcslic gt 确定启动 Licenses 管理工具 触摸屏组态编程软件 YKBuilder是中达优控YKHMI系列人机界面的集成
  • curl在windows的安装和使用

    经常看到别人在用curl命令可以请求各种网络请求在命令行里 看起来挺炫酷的 curl作为一个请求web服务器的命令行工具 玩得好甚至可以代替postman 这里我就是讲一下关于如何安装curl在windows上 毕竟很多时候用的电脑都是公司
  • LDAP未授权漏洞验证

    因为工作需要 这里验证了下LDAP未授权 以下是收集到的资料 最后是具体使用 更新 2 连接ad域有两个地址 ldap http XXXXX com 389 和 ldap http XXXXX com 636 SSL 3 端口389用于一般
  • 根据接口数据返回的不同字段显示不同背景颜色

    结构 div span item hldj substr 0 2 span substr 0 2 要抽取的子串的起始下标 从0开始截取2位 如南一公园只会显示南一 div 交互 methods toHldj item if item hld
  • 制作镜像并上传到阿里云

    run一个ubuntu容器 然后自动进入容器 ucsmy QKTEST21191 docker run it name node daocloud io ubuntu root 3ac09729dadb 安装geth sudo apt ge
  • 使用Bootstrap样式的死的简单Vue分页组件

    网页 vue pages A Dead Simple Vue Pagination Component Using Bootstrap Style 使用Bootstrap样式的死的简单Vue分页组件 support vue 2 0 支持vu
  • Unity的C#编程教程_52_类 Class 详解及应用练习(一)

    文章目录 C Classes for Behaviours Custom Classes 1 Custom Classes 2 Serialized Custom Class RPG Item Database Example 3 When
  • C++的tuple

    一 介绍 tuple是一个固定大小的不同类型值的集合 是泛化的std pair 我们也可以把它当做一个通用的结构体来用 不需要创建结构体又获取结构体的特征 在某些情况下可以取代结构体使程序更简洁 直观 std tuple理论上可以有无数个任
  • react项目配置@指向src文件夹

    react项目配置 指向src文件夹 react项目没有和vue一样有 指向src文件夹 需要手动配置 配置了之后 就代表 src 目录 就不用自己 暴露项目配置项 任选一种 npm方式 npm run eject cnpm方式 cnpm
  • C++获取电脑主板唯一标识

    获取电脑的唯一标识有很多好处 比如注册 授权等 而且电脑中有很多是唯一标识的硬件 比如网卡 CPU 硬盘 主板等 但是如果电脑中有两个网卡的话 就不知道使用哪个网卡作为唯一的了 可以通过获取主板的ID 作为唯一的标识 通常情况下 可以通过命
  • 无限法则服务器错误登录期间发生错误,无限法则错误126的解决方案分享 Error126错误提示...

    无限法则错误126的解决方案分享 Error126错误提示 许多玩家在玩游戏时遇到了Error126的情况 那么出现这个问题该怎么解决呢 无限法则Error126报错解决方法希望对大家有所帮助 问题描述 出现Error 126错误提示 12
  • win10 win11 远程连接 凭据不工作 无法建立连接

    Windows 远程连接 远程连接个人或者学校电脑 Windows系统 时经常遇到无法连接的情况 本文结合两种情况给出相应解决方法 No 1 问题描述 无法建立连接 未知连接错误 解决方法 查看目标ipv4地址是否正确 在windows W
  • 【JavaWeb学习】CSS(文本和图片)

    字体 color 前景色 用来设置字体的颜色 font size 字体大小 font family 字体族 指定字体的类别 浏览器自动使用该类别下的字体 可以同时指定多个字体 多个字体间用逗号隔开 前一个无法使用就用后一个 字体能否使用由用
  • (邱维声)高等代数课程笔记:极大线性无关组,向量组的秩

    极大线性无关组 向量组的秩 quad 一般地 设 V V V 是数域 K K K 上的一个线性空间
  • 好用的网络请求库Retrofit2(入门及讲解)

    前言 首先 先给出官网 GitHub Retrofit 官网 Retrofit 其次 要吐槽一下官网首页给出的例子 如果你照着例子改 会发现根本没法运行 不是少包就是少关键语句 相关内容可以参看我的另一篇文章 Retrofit 2 0 入门
  • 【论文翻译】边缘应用中加速卷积神经网络的剪枝算法综述

    摘要 随着卷积神经网络 CNN 模型大小的增加 模型压缩和加速技术对于在边缘设备上部署这些模型变得至关重要 在本文中 我们对修剪进行了全面的调查 这是一种主要的压缩策略 可以从CNN模型中删除非关键或冗余的神经元 调查涵盖了修剪的总体动机
  • VC++设置与取得系统音量

    MMRESULT rc 多媒体函数返回结果变量 HMIXER hMixer 混合器设备句柄 MIXERLINE mxl 音频线路标准状态信息结构体 MIXERLINECONTROLS mxlc 音频线路控制器集合信息结构体 MIXERCON
  • 启动arbiter失败Oplog entry at { ts: Timestamp 1651735515000

    mongodb版本是 mongodb linux x86 64 3 4 2 tgz 操作系统 中标麒麟服务器版 问题 查看日志 日志里面提示 2022 05 06T14 27 50 862 0800 I REPL initandlisten
  • SUSAN边缘检测算法,及其Matlab和OpenCV实现

    1 SUSAN边缘检测计算步骤 1 在图像上放置一个37个像素的圆形模板 模板在图像上滑动 依次比较模板内各个像素点的灰度与模板核的灰度 判断是否属于USAN区域 判别函数如下 其中 r 0 vec r 0 r