《opencv实用探索·十三》opencv之canny边缘检测

1、canny边缘检测应用场景

目标检测:
Canny边缘检测可以用于检测图像中的目标边缘,从而帮助识别和定位物体。在目标检测的流程中,边缘通常是检测的第一步。
图像分割:
Canny边缘检测可用于图像分割,即将图像划分为具有相似属性的区域。图像分割是许多计算机视觉任务的基础,如图像分析、物体识别等。
图像增强:
Canny边缘检测可以突出图像中的边缘特征,从而增强图像的结构信息。这对于图像处理任务,如图像重建和特征提取,非常有帮助。
边缘跟踪:
Canny边缘检测是一种强边缘跟踪器,可以用于跟踪图像中的曲线和边缘。
机器视觉和自动驾驶: 在机器视觉和自动驾驶系统中,Canny边缘检测可用于检测道路边缘、车辆和行人等物体。
医学图像处理:
在医学图像中,Canny边缘检测用于检测器官的边缘,从而协助医生进行诊断和手术规划。
光学字符识别(OCR):
在文字识别领域,Canny边缘检测可用于提取文本的边缘,以帮助进行光学字符识别。
图像分析:
Canny边缘检测在图像分析中是一种常见的工具,用于提取图像的重要特征。

2、canny边缘检测步骤
(1)噪声抑制:
在进行边缘检测之前,通常会对图像进行平滑以抑制噪声。这通常使用高斯滤波器来实现,可以通过cv::GaussianBlur函数完成。
(2)计算图像梯度:
使用Sobel算子计算图像在水平和垂直方向上的梯度。这个过程可以通过cv::Sobel函数实现。
(3)计算梯度的幅值和方向:
根据梯度的水平和垂直分量,计算梯度的幅值和方向。这可以通过cv::magnitude和cv::phase实现。
(4)非极大值抑制:
对梯度幅值图进行非极大值抑制,保留梯度方向上的局部最大值。这一步骤有助于细化边缘,使其更接近实际的边界。
(5)双阈值边缘跟踪:
根据设定的两个阈值(高阈值和低阈值),对非极大值抑制后的图像进行阈值处理,得到二值图像。高阈值用于确定强边缘,低阈值用于确定可能的边缘。通常,高阈值选取的较高,低阈值选取的较低。
(6)边缘连接:
对低阈值下的边缘像素进行连接,使其连接到高阈值下的边缘。这一步骤可以使用递归或迭代方法实现。

对于高斯滤波和梯度计算在之前的章节已经阐述过,请点击高斯滤波和梯度计算进行回顾。

这里解释下什么是梯度幅值和方向:
边缘检测算子返回水平方向的Gx和垂直方向的Gy。梯度的幅度𝐺和方向𝛩(用角度值表示)为:
在这里插入图片描述
式中,atan2(•)表示具有两个参数的 arctan 函数。

梯度幅值是梯度矢量的长度,表示图像在某一点的强度变化的大小,梯度的方向总是与边缘垂直的,通常就近取值为水平(左、右)、垂直(上、下)、对角线(右上、左上、左下、右下)等 8 个不同的方向。

因此,在计算梯度时,我们会得到梯度的幅度和角度(代表梯度的方向)两个值。

下图展示了梯度的表示法。其中,每一个梯度包含幅度和角度两个不同的值。为了方便观察,这里使用了可视化表示方法。例如,左上角顶点的值“2↑”实际上表示的是一个二元数对“(2, 90)”,表示梯度的幅度为 2,角度为 90°。
在这里插入图片描述

非极大值像素梯度抑制:
在具体实现时,逐一遍历像素点,判断当前像素点是否是周围像素点中具有相同梯度方向的最大值,并根据判断结果决定是否抑制该点。如果当前像素点是周围像素点中最大值,我们保留该像素值,否则将其抑制为零。

例如A、B、C 三点具有相同的方向(梯度方向垂直于边缘)如下图。判断这三个点是否为各自的局部最大值:如果是,则保留该点;否则,抑制该点(归零)。
在这里插入图片描述
从图中可以看到A点在图像边缘,所以A 点具有最大的局部值,所以保留 A 点(称为边缘),其余两点(B和 C)被抑制(归零)。

再比如下图中,黑色背景的点都是向上方向梯度(边缘处于水平)的局部最大值。因此,这些点会被保留;其余点被抑制(处理为 0)。这意味着,这些黑色背景的点最终会被处理为边缘点,而其他点都被处理为非边缘点。
在这里插入图片描述
经过上述处理后,对于同一个方向的若干个边缘点,基本上仅保留了一个,使得检测到的边缘更狭窄,更接近实际的边界。

当完成非极大值抑制后,只保留了效果明显的边缘,然而,对于这些边缘,有些确实是图像的边缘,而有些却是由噪声产生的。之前用高斯滤波只是降噪,并不能消除噪声。而这些噪声造成的边缘被称为虚边缘,我们需要通过双值域将其消除。

双阈值设置:
首先设置两个阈值:高阈值(highThreshold)和低阈值(lowThreshold),高阈值用于确定强边缘,低阈值用于确定可能的边缘。对于所有的像素点,逐一遍历,如果当前边缘像素的梯度值 大于高阈值定为强边缘, 低于高阈值但是高于低阈值被定为虚边缘, 低于低阈值的像素点(抑制)置零。
所有的强边缘保留,而对于虚边缘,我们要做个判断。如果这些虚边缘是连接着强边缘的,那么保留,如果不是,那么抑制(置零)。

下面以一个示例图来说明。
图中Max和Min表示高低阈值,A在Max上面为强边缘直接保留,B在Max和Min之间为虚边缘,但B连着B,故也认定为边缘,保留。C也处于Max和Min之间,但C和A没有连接,故认定C不是边缘,被抑制。D之间小于低阈值,之间被抑制为0。

最后进行边缘连接,其过程如下:
(1)遍历经过非极大值抑制后的梯度幅值图像(图像经过非极大值抑制后只有边缘上的像素点的梯度幅值被保留,其他像素点的梯度幅值为零。)
(2)将大于高阈值的像素点标记为强边缘,高低阈值之间的像素值标记为弱边缘。
(3)从弱边缘像素出发,沿着其梯度方向前进,如果相邻像素中有强边缘像素(梯度幅值大于高阈值),则将其标记为强边缘,并继续追踪。追踪过程中,可能的边缘像素逐渐被标记为强边缘,形成一个连接的边缘。
(4)重复以上步骤,直到没有新的像素被添加到连接的边缘。最终,连接的边缘像素集合就是Canny边缘检测算法的输出。

3、opencv之canny接口调用

void cv::Canny(InputArray image,         // 输入图像(单通道8位灰度图像)OutputArray edges,         // 输出边缘图像double threshold1,        // 低阈值double threshold2,        // 高阈值int apertureSize = 3,      // Sobel算子核的大小,默认为3bool L2gradient = false    // 是否使用更精确的L2范数梯度计算,默认为false
);

双阈值怎么设定?

通常建议高阈值与低阈值的比例在2:1到3:1之间。
例如,如果设置高阈值为100,则低阈值可以设置为50或33。
根据图像特性:
可以根据图像的特性来调整阈值。如果图像中的边缘比较弱,可以适当降低阈值;如果图像中的边缘比较强,可以适当提高阈值。

参考代码:

int main() 
{  // 读取灰度图像cv::Mat image = cv::imread("1.jpg", cv::IMREAD_GRAYSCALE);// 检查图像是否成功读取if (image.empty()) {std::cerr << "Error: Could not read the image." << std::endl;return -1;}// 应用Canny边缘检测cv::Mat edges;double lowThreshold = 50;  // 低阈值double highThreshold = 150;  // 高阈值//高斯滤波去噪后检测图像边缘GaussianBlur(image, image, Size(3, 3), 0);cv::Canny(image, edges, lowThreshold, highThreshold);// 显示原始图像和Canny边缘检测的输出cv::imshow("Original Image", image);cv::imshow("Canny Edges", edges);// 等待用户按键cv::waitKey(0);return 0;
}

效果图如下:
左边是之间通过canny检测的边缘,右边是先通过高斯滤波去噪后再使用canny检测的边缘,可以明显的发现先去噪再检测边缘效果会更好。
在这里插入图片描述

参考文章:opencv基础44- Canny边缘检测详解-cv.Canny()

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/205133.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

微服务--08--Seata XA模式 AT模式

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 分布式事务Seata 1.XA模式1.1.两阶段提交1.2.Seata的XA模型1.3.优缺点 AT模式2.1.Seata的AT模型2.2.流程梳理2.3.AT与XA的区别 分布式事务 > 事务–01—CAP理论…

class050 双指针技巧与相关题目【算法】

class050 双指针技巧与相关题目【算法】 算法讲解050【必备】双指针技巧与相关题目 code1 922. 按奇偶排序数组 II // 按奇偶排序数组II // 给定一个非负整数数组 nums。nums 中一半整数是奇数 &#xff0c;一半整数是偶数 // 对数组进行排序&#xff0c;以便当 nums[i] 为…

HarmonyOS开发(十):通知和提醒

1、通知概述 1.1、简介 应用可以通过通知接口发送通知消息&#xff0c;终端用户可以通过通知栏查看通知内容&#xff0c;也可以点击通知来打开应用。 通知使用的的常见场景&#xff1a; 显示接收到的短消息、即使消息...显示应用推送消息显示当前正在进行的事件&#xff0c…

dbug_hub 错误 使用多个ILA导致

记录一下vivado调整dbg_hub时钟调整的方法 (dengkanwen.com) 解决方法参考以上链接。 或&#xff0c;使用高速下载器&#xff1f;

MySQL数据库与其管理工具Navicat

这里介绍MySQL数据库和Navicat的使用 1.下载MySQL数据库及MySQL客户端管理工具Navicat 登录www.mysql.com下载MySQL 登录www.navicat.com.cn/download下载客户端管理工具 2.启动MySQL数据库服务器 以管理员身份打开命令提示窗口 找到mysql的bin目录 输入初始化命令mysqld…

Java毕业设计源码—vue+SpringBoot图书借阅管理图书馆管理系统

主要技术 SpringBoot、Mybatis-Plus、MySQL、Vue3、ElementPlus等 主要功能 管理员模块&#xff1a;注册、登录、书籍管理、读者管理、借阅管理、借阅状态、修改个人信息、修改密码 读者模块&#xff1a;注册、登录、查询图书信息、借阅和归还图书、查看个人借阅记录、修改…

Docker 镜像构建的最佳做法

一、镜像分层 使用docker image history命令&#xff0c;可以看到用于在镜像中创建每个层的命令。 1、 使用docker image history命令查看创建的入门镜像中的层。 docker image history getting-started 您应该得到如下所示的输出&#xff1a; IMAGE CREATED…

office办公技能|ppt插件使用

PPT插件获取&#xff1a;链接&#xff1a;https://pan.baidu.com/s/1BOmPioUKeY2TdC-1V-o3Vw 提取码&#xff1a;tdji 一、ppt插件介绍 PPT插件是一种可以帮助用户在Microsoft PowerPoint软件中添加各种额外功能和效果的应用程序。使用PPT插件可以让用户更加轻松地制作出专业、…

Linux环境下用yum安装postgres15

1. 下载PostgreSQL 15 安装包 在官网选择对应版本的安装包 https://www.postgresql.org/download/ Linux | CentOS 7 | PostgreSQL 15 2. 安装PostgreSQL 15 sudo yum install -y https://download.postgresql.org/pub/repos/yum/reporpms/EL-7-x86_64/pgdg-redhat-repo-la…

业务场景中Hive解析Json常用案例

业务场景中Hive解析Json常用案例 json在线工具 json格式转换在线工具 https://tool.lu/json/format格式互转&#xff1a; // 格式化可以合并整行显示 {"name":"John Doe","age":35,"email":"johnexample.com"}// 格式化…

(一)rtthread主线程启动流程

&#xff08;一&#xff09;rtthread主线程启动流程 声明1.启动分析2.源码分析 声明 本文主要为个人学习笔记内容总结&#xff0c;有来自网络及其他&#xff0c;如有雷同&#xff0c;请告知。 1.启动分析 基于&#xff1a;rt-thread-v5.0.1 先执行&#xff1a;汇编代码start…

Implicit Neural Representation for Cooperative Low-light Image Enhancement

GitHub - Ysz2022/NeRCo: [ICCV 2023] Implicit Neural Representation for Cooperative Low-light Image Enhancement 参考&#xff1a;ICCV2023 | 将隐式神经表征用于“低光增强”&#xff0c;北大张健团队提出NeRCo (qq.com) 以下三个因素限制了现有低光图像增强方法的应用…

workbench导入sql脚本文件

这里面有个Data Import 点击start Import 刷新一下导入完成

MIT6.S081Lab5:xv6 lazy page allocation

Eliminate allocation from sbrk() 这个相当简单&#xff0c;在sys_sbrk中对growproc的调用注释掉就行&#xff0c;然后把sz加上n。这样应该分配的页面没有分配&#xff0c;同时也没有映射到页表&#xff0c;所以使用这些分配的页面的时候会报错panic: uvmunmap: not mapped。…

Docker 一些设置

一、时间设置 如果容器已经运行了 docker exec -it 容器名或id bash mkdir -p /usr/share/zoneinfo/Asia exit docker cp /usr/share/zoneinfo/Asia/Shanghai 容器ID或容器名:/usr/share/zoneinfo/Asia docker exec -it 容器名或id bash cp /usr/share/zoneinfo/Asia/Shang…

【Https】HTTPS协议 的介绍及作用

HTTPS协议是一种安全的网络传输协议&#xff0c;它在传统的HTTP协议上加入了SSL/TLS加密层&#xff0c;用于保护数据传输的安全性和完整性。HTTPS协议是由HTTP和SSL层组成的&#xff0c;其中SSL&#xff08;安全套接层&#xff09;或其继任者TLS&#xff08;传输层安全协议&…

C++多态(详解)

一、多态的概念 1.1、多态的概念 多态&#xff1a;多种形态&#xff0c;具体点就是去完成某个行为&#xff0c;当不同的对象去完成时会产生出不同的状态。 举个例子&#xff1a;比如买票这个行为&#xff0c;当普通人买票时&#xff0c;是全价买票&#xff1b;学生买票时&am…

【Python深度学习第二版】学习笔记之——神经网络

首先来说对于神经网络这几章看的很懵&#xff0c;虽然作者已经去掉了数学公式相关内容&#xff0c;讲得已经很想让读者容易理解了&#xff0c;奈何读完还是一知半解&#xff0c;下面就以我目前的理解简单记录一下吧&#xff0c;往后了解的多了再回头看一看。 一、张量运算 作…

故宫博物院与周大福珠宝集团 战略合作签约仪式在京举行

12月5日上午&#xff0c;故宫博物院与周大福珠宝集团战略合作签约仪式在故宫博物院故宫文化资产数字化应用研究所举行。文化和旅游部党组成员、故宫博物院院长王旭东&#xff0c;国际儒学联合会常务副会长、原文化部副部长丁伟&#xff0c;国际儒学联合会特别顾问、中国国际友好…

深入了解Java Duration类,对时间的精细操作

阅读建议 嗨&#xff0c;伙计&#xff01;刷到这篇文章咱们就是有缘人&#xff0c;在阅读这篇文章前我有一些建议&#xff1a; 本篇文章大概6000多字&#xff0c;预计阅读时间长需要5分钟。本篇文章的实战性、理论性较强&#xff0c;是一篇质量分数较高的技术干货文章&#x…