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

news/2025/2/13 4:58:44/

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.ppmy.cn/news/1228435.html

相关文章

计算机毕业设计 基于SpringBoot的健身房管理系统的设计与实现 Java实战项目 附源码+文档+视频讲解目录

博主介绍&#xff1a;✌从事软件开发10年之余&#xff0c;专注于Java技术领域、Python人工智能及数据挖掘、小程序项目开发和Android项目开发等。CSDN、掘金、华为云、InfoQ、阿里云等平台优质作者✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精…

慢日志查询

概述 MySQL的慢查询日志是MySQL提供的一种日志记录&#xff0c;它用来记录在MySQL中响应时间超过阀值的语句&#xff0c;具体指运行时间超过 long_query_time 值的SQL&#xff0c;则会被记录到慢查询日志中&#xff0c;ong_query_time 的默认值为 10&#xff0c;意思是运行10S…

面试资料快速复习 Git常用命令(简单实用)

Git-command Git常用命令、面试复习、简单实用命令 ​ 一、概念理解 &#xff08;一&#xff09;工作区、暂存区、本地仓库、远程仓库 workspace&#xff1a;工作区staging area&#xff1a;暂存区/缓存区local repository&#xff1a;本地仓库remote repository&#xff…

PTA 7-6 数据类型判断(c++)

从键盘分别输入通过空格分割的整型(int)、浮点型(double)、字符型(String)、布尔型(boolean)&#xff0c;根据读取的内容判断他们的类型并将他们解析为正确的对象&#xff0c;并都放到一个数组中。输出各个对象的类型 输入格式: 字符串 输出格式: 数据类型 输入样例: 在这…

ARouter出现 there‘s no route matched in group问题排查

在使用ARouter时候会出现找不到映射路径的问题&#xff0c;这里给兄弟们总结下踩过的坑 所有用到的模块都要有填写依赖 android {defaultConfig {......javaCompileOptions {annotationProcessorOptions {arguments [AROUTER_MODULE_NAME: project.getName()]}}} } ... depe…

自动驾驶学习笔记(九)——车辆控制

#Apollo开发者# 学习课程的传送门如下&#xff0c;当您也准备学习自动驾驶时&#xff0c;可以和我一同前往&#xff1a; 《自动驾驶新人之旅》免费课程—> 传送门 《Apollo Beta宣讲和线下沙龙》免费报名—>传送门 文章目录 前言 控制器设计 比例积分微分控制 线性…

C/C++统计数 2021年12月电子学会青少年软件编程(C/C++)等级考试一级真题答案解析

目录 C/C统计数 一、题目要求 1、编程实现 2、输入输出 二、算法分析 三、程序编写 四、程序说明 五、运行结果 六、考点分析 C/C统计数 2021年12月 C/C编程等级考试一级编程题 一、题目要求 1、编程实现 给定一个数的序列S&#xff0c;以及一个区间[L, R], 求序列…

第20章 数据库编程

通过本章需要理解JDBC的核心设计思想以及4种数据库访问机制&#xff0c;理解数据库连接处理流程&#xff0c;并且可以使用JDBC进行Oracle数据库的连接&#xff0c;理解工厂设计模式在JDBC中的应用&#xff0c;清楚地理解DriverManager类的作用&#xff0c;掌握Connection、Prep…