【C++】【Opencv】cv::Canny()边缘检测函数详解和示例

Canny边缘检测是一种流行的边缘检测算法,由John F. Canny在1986年开发。它是一种多阶段过程,包括噪声滤波、计算图像强度的梯度、非最大值抑制以及双阈值检测。本文通过函数原型解读和示例对cv::Canny()函数进行详解,以帮助大家理解和使用。

原理

Canny边缘检测的步骤如下:

(1)高斯滤波(噪声滤波):使用高斯滤波器平滑图像以减少噪声。高斯滤波器是一种线性滤波器,可以消除图像中的高频噪声。
(2)计算梯度强度和方向:计算图像中每个像素的梯度强度和方向。梯度强度表示像素点处的边缘强度,而梯度方向表示边缘的方向。
(3)非最大值抑制:在计算梯度强度和方向后,非最大值抑制将抑制那些不是局部最大值的像素点。这意味着只有局部最大值的像素点才会被保留下来。
(4)双阈值检测:最后,双阈值检测用于检测边缘。这需要两个阈值,通常称为低阈值和高阈值。如果像素的梯度强度大于高阈值,则该像素被视为边缘;如果像素的梯度强度在两个阈值之间,则该像素被视为边缘候选;如果像素的梯度强度低于低阈值,则该像素被视为非边缘。

函数介绍

void cv::Canny(InputArray image, OutputArray edges, double lowThreshold, double highThreshold, int apertureSize = 3);参数解释:image:输入图像,应该是灰度图像。
edges:输出图像,即检测到的边缘图像。
lowThreshold:低阈值,用于双阈值检测。
highThreshold:高阈值,用于双阈值检测。
apertureSize:指定Sobel算子的大小,默认为3。

运行示例

设置阈值分别为50和150。
代码如下:

#include <opencv2/opencv.hpp>
#include <iostream>using namespace cv;
using namespace std;int main() {Mat image = imread("ceshi.jpg", IMREAD_COLOR); // 读取输入图像if (image.empty()) {cout << "Failed to read image." << endl;return -1;}Mat gray_image; cvtColor(image, gray_image, COLOR_BGR2GRAY); // 转换为灰度图像Mat edges_image;// 应用Canny边缘检测算法Canny(gray_image, edges_image, 50, 150);// 显示结果图像imshow("Input", image);imshow("Edges", edges_image);imwrite("cnany.jpg", edges_image);waitKey(0);return 0;
}

在上面的示例中,我们首先读取输入图像并将其转换为灰度图像。然后,我们使用Canny函数应用Canny边缘检测算法,并指定两个阈值(低阈值和高阈值)。最后,我们显示原始图像和检测到的边缘图像。图像对比如下所示。

在这里插入图片描述
上面为原图,下面为边缘检测效果图。
在这里插入图片描述

小结

选择使用Canny函数进行边缘计算时,应根据项目需求和场景,设置合适的低阈值和高阈值参数,以获得最佳的边缘检测结果。较低的阈值可能会导致更多的边缘被检测到,而较高的阈值可能会导致较少的边缘被检测到。因此,选择适当的阈值是使用Canny边缘检测函数的关键之一。

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

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

相关文章

洛谷 P1064 [NOIP2006 提高组] 金明的预算方案 python解析

P1064 [NOIP2006 提高组] 金明的预算方案 时间&#xff1a;2023.11.19 题目地址&#xff1a;[NOIP2006 提高组] 金明的预算方案 题目分析 动态规划的0-1背包&#xff0c;采用动态数组。如果不了解的话&#xff0c;可以先看看这个背包DP。 这个是0-1背包的标准状态转移方程 f…

腾讯微服务平台TSF学习笔记(一)--如何使用TSF的Sidecar过滤器实现mesh应用的故障注入

Mesh应用的故障注入 故障注入前世今生Envoy设置故障注入-延迟类型设置故障注入-延迟类型并带有自定义状态码总结 故障注入前世今生 故障注入是一种系统测试方法&#xff0c;通过引入故障来找到系统的bug&#xff0c;验证系统的稳健性。istio支持延迟故障注入和异常故障注入。 …

大模型的交互能力

摘要&#xff1a; 基础大模型显示出明显的潜力&#xff0c;可以改变AI系统的开发人员和用户体验&#xff1a;基础模型降低了原型设计和构建AI应用程序的难度阈值&#xff0c;因为它们在适应方面的样本效率&#xff0c;并提高了新用户交互的上限&#xff0c;因为它们的多模式和生…

RobotFramework之用例执行时添加命令行参数(十三)

学习目录 引言 标签tag 设置变量 随机执行顺序 设置监听器 输出日志目录和文件 引言 Robot Framework 提供了许多命令行选项&#xff0c;可用于控制测试用例的执行方式以及生成的输出。本节介绍一些常用的选项语法。 标签tag 之前文章我们介绍过&#xff0c;在测试套件…

浅谈滑动窗口

滑动窗口是什么&#xff1f; 滑动窗口其实是一个想象出来的数据结构。有左边界L和有边界R。 举例来说&#xff1a;数组 arr {3,1,5,7,6,5,8}; 其窗口就是我们规定的一个运动轨迹。 最开始时&#xff0c;边界LR都在数组的最左侧&#xff0c;此时没有包住任何数。 此时规定&…

线性变换概论

线性变换 定义 设 V V V 和 W W W 都是在域 K K K上定义的向量空间&#xff0c; T : V → W T :V \rightarrow W T:V→W 对任二向量 x , y ∈ V x,y \in V x,y∈V,与任何标量 a ∈ K a \in K a∈K&#xff0c;满足&#xff1a; T ( x y ) T ( x ) T ( y ) T(xy)T(x)T(…

Windows 的 WSL 中运行 EasyConnect

Windows 的 WSL 中运行 EasyConnect docker-easyconnect 安装 Docker Desktop 通过 Docker 的官网 Docker Desktop 下载并安装. 安装过程一直下一步即可, 默认推荐 WSL 模式 初始化过程需要梯子 安装完后在搜索框搜索 docker-easyconnect hagb/docker-easyconnect 就是需要…

Spring Boot中使用Redis进行大数据缓存

Spring Boot中使用Redis进行大数据缓存 在Spring Boot中使用Redis进行大数据缓存是一种常见的做法&#xff0c;因为Redis是一种高性能的内存数据库&#xff0c;适用于缓存大量数据。以下是说明和示例代码&#xff0c;演示如何在Spring Boot项目中使用Redis进行大数据缓存。 步…

【Spring总结】注解开发

本篇讲的内容主要是基于Spring v2.5的注解来完成bean的定义 之前都是使用纯配置的方式来定义的bean 文章目录 前言1. Spring v2.5 注解开发定义bean第一步&#xff1a;在需要定义的类上写上注解Component第二步&#xff1a;在Spring Config中定义扫描包第三步&#xff1a;主方法…

在线ws/wss调试工具

具体前往&#xff1a;在线webSocket(ws)调试工具

项目点使用Redis作为缓存技术-自用

在spring boot项目中&#xff0c;使用缓存技术只需在项目中导入相关缓存技术的依赖包&#xff0c;并在启动类上使用EnableCaching开启缓存支持即可。 例如&#xff0c;使用Redis作为缓存技术&#xff0c;只需要导入Spring data Redis的maven坐标即可。 描述 使用Redis缓存高频数…