当前位置: 首页 > article >正文

【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.kler.cn/news/136179.html

相关文章:

  • Python | Leetcode Python题解之第509题斐波那契数
  • Electron 离线环境打包解决方案(electron-forge)
  • 力扣刷题(sql)--零散知识点(1)
  • kafka 分布式(不是单机)的情况下,如何保证消息的顺序消费?
  • 【我的 PWN 学习手札】setcontext + shellcode
  • 3.swoole安装【Docker】
  • MATLAB实战应用案例精讲(二)-【图像处理】图像分类(附MATLAB代码实现)
  • 设置指定时间之前的时间不可选
  • k8s上Pod生命周期、重启策略、容器探测简介
  • 认识前端包常用包管理工具(npm、cnpm、pnpm、nvm、yarn)
  • 苹果CMS首涂第30套可装修DIY主题模板免授权版
  • Spring IOC - Bean的生命周期之依赖注入
  • 【论文阅读笔记】Deep learning for time series classification: a review
  • 数理统计的基本概念(二)
  • 奇富科技发布鸿蒙元服务1.0版本,打造鸿蒙生态金融科技全新体验
  • 【总结】坐标变换和过渡矩阵(易忘记)
  • AI绘画使用Stable Diffusion(SDXL)绘制三星堆风格的图片
  • LLM模型-讯飞星火与百度文心api调用
  • 竞赛 题目:基于深度学习的人脸表情识别 - 卷积神经网络 竞赛项目 代码
  • C++:拷贝构造函数,深拷贝,浅拷贝
  • 第十七篇-Awesome ChatGPT Prompts-备份-百度翻译
  • Android 电量优化概览
  • redis非关系型数据库(缓存型数据库)——中间件
  • vue3父组件提交校验多个子组件
  • Excel自定义函数提取超链接
  • qt treeview 删除节点