手把手教你OpenCV实现Canny边缘检测 C++

news2024/12/29 10:58:31

1,原理

canny边缘检测算子是传统边缘检测算子中最优秀的,canny检测基于下面三个目标:

(1)低错误率。即所有边缘都应该找到,并且没有虚假边缘。

(2)准确的定位边缘。即检测到的边缘应该接近真实的边缘。

(3)单个边缘点响应。即对于边缘检测,只返回单点厚度的结果。

1.1 方法步骤

(1)使用高斯滤波器平滑图像(基本边缘检测基本都有这步,为了减少噪声的影响)

(2)计算梯度幅值和边缘方向

(3)非极大值抑制(细化边缘)

(4)使用双阈值处理和连通性分析检测和链接边缘

2 c++ opencv代码

#include <opencv2/opencv.hpp>
#include <iostream>

using namespace cv;
using namespace std;	


int main()
{
	string path = "./img_all/2.png";
	Mat img = imread(path);
	Mat imgGray, imgBlur, imgCanny, imgDil, imgErode;

	cvtColor(img, imgGray, COLOR_BGR2GRAY); //灰度化
	GaussianBlur(img, imgBlur, Size(3, 3), 3, 0); //高斯模糊
	Canny(imgBlur, imgCanny, 25, 75); //边缘检测

	Mat kernel = getStructuringElement(MORPH_RECT, Size(3, 3));
	dilate(imgCanny, imgDil, kernel);
	erode(imgDil, imgErode, kernel);

	imshow("Image", img);
	imshow("ImageGray", imgGray);
	imshow("ImageBlur", imgBlur);
	imshow("ImageCanny", imgCanny);
	imshow("ImageDilation", imgDil);
	imshow("ImageErode", imgErode);
	waitKey(0);

	return 0;
}

定义了一个字符串变量 path,存储要处理的图像文件的路径

Mat img = imread(path);

使用 imread 函数从指定路径读取图像到 Mat 类型的变量 img 中。

Mat imgGray, imgBlur, imgCanny, imgDil, imgErode;

声明了五个 Mat 类型的变量,分别用于存储不同处理阶段的图像。

cvtColor(img, imgGray, COLOR_BGR2GRAY); //灰度化

使用 cvtColor 函数将原始图像 img 转换为灰度图像 imgGray

GaussianBlur(imgGray, imgBlur, Size(3, 3), 3, 0); //高斯模糊

使用 GaussianBlur 函数对灰度图像 imgGray 应用高斯模糊,生成模糊后的图像 imgBlurSize(3, 3) 定义了高斯核的大小,3 是高斯核的标准偏差。

Canny(imgBlur, imgCanny, 25, 75); //边缘检测

使用 Canny 函数对模糊后的图像 imgBlur 进行边缘检测,生成边缘图像 imgCanny2575 是边缘检测的阈值。

Mat kernel = getStructuringElement(MORPH_RECT, Size(3, 3));

创建了一个结构元素 kernel,用于膨胀和腐蚀操作。这里使用的是矩形结构元素,大小为 3x3

dilate(imgCanny, imgDil, kernel);

使用 dilate 函数对边缘图像 imgCanny 进行膨胀操作,生成膨胀后的图像 imgDil

erode(imgDil, imgErode, kernel);

使用 erode 函数对膨胀后的图像 imgDil 进行腐蚀操作,生成腐蚀后的图像 imgErode

3,结果

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

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

相关文章

几款设计师必备的AI抠图软件工具分享给你!

前言 在图像处理领域&#xff0c;抠图是一项基本而关键的技能。传统上&#xff0c;PS是作为抠图的首选工具&#xff0c;但其操作复杂性往往令初学者望而却步。幸运的是&#xff0c;随着AIGC技术的发展&#xff0c;现在有多款AI软件和在线网站能够以更简单、快捷的方式完成抠图…

怎么把图片压缩更小?快捷缩小图片的3个在线工具

现在每天都会需要接触很多的图片&#xff0c;当图片在本地存储到一定数量时会占用大量的内存&#xff0c;并且不利于在网上传输使用&#xff0c;那么有什么方法能够快速压缩图片太大呢&#xff1f;在线改图片大小是一种比较简单的缩小图片的处理方法&#xff0c;在网上也有很多…

【多线程-从零开始-柒】代码案例1—单例模式

单例模式&#xff1a;是一种设计模式 设计模式&#xff0c;类似于“棋谱”&#xff0c;就是固定套路&#xff0c;针对一些特定的场景&#xff0c;给出一些比较好的解决方法只要按照设计模式来写代码&#xff0c;就可以保证代码不会太差&#xff0c;保证代码的下限 设计模式 设…

【性能优化】DNS解析优化

前言 DNS解析过程消耗时间DNS有本地缓存 比如首次访问某站点&#xff0c;会耗费很多时间进行DNS解析&#xff0c;但解析结束后会将ip地址存入本地设备&#xff0c;后续再访问此域名时就会直接从缓存中取。 首次访问页面时&#xff0c;本页面的DNS解析是无法优化的&#xff0…

antv l7简化版demo(含mapbox样例)

<!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><link rel"stylesheet" href"https://gw.alipayobjects.com/os/rmsportal/PqLCOJpqoOUfuPRacUzE.css" /><title>滑过默认高亮</…

Linux磁盘管理与文件结构(二):实用工具和命令、fdisk分区示例

文章目录 4、查看或管理磁盘分区-fdisk格式选项示例 4、示例&#xff1a;使用 fdisk 命令创建分区需求操作步骤 5、创建文件系统-mkfs格式常用选项示例创建其他类型的文件系统 6、创建文件系统-mkswap格式常用选项示例拓展&#xff1a;关闭和启用交换分区拓展&#xff1a;swap分…

路径规划 | 五种经典算法优化机器人路径规划(Matlab)

目录 效果一览基本介绍程序设计参考文献 效果一览 基本介绍 五种经典算法优化机器人路径规划&#xff0c;算法可任意更换&#xff01;地图可修改&#xff01;Matlab语言 1.分为简单路径规划和复杂路径规划两种情景&#xff0c;采用粒子群算法(PSO)&#xff0c;遗传算法(GA)&am…

[Qt][信号与槽][上]详细讲解

目录 0.Q_OBJECT宏1.信号和槽概述1.信号2.槽3.说明 2.信号和槽的使用1.连接信号和槽2.查看内置信号和槽 0.Q_OBJECT宏 Qt如果要让某个类能够使用信号槽&#xff0c;则必须要在类最开始的地方&#xff0c;写下Q_OBJECT宏 1.信号和槽概述 1.信号 在Qt中&#xff0c;⽤⼾和控件…

如何在银河麒麟操作系统上搭建 Electron (含 Electron 打包指南)

本次教程所用版本 QT版本&#xff1a;5.12 Eletron版本&#xff1a;31.3.1 Electron-packager版本&#xff1a;17.1.2 VScode版本&#xff1a;1.92.0 Node版本&#xff1a;18.19.0 npm版本&#xff1a;10.2.3 前言&#xff1a; 随着跨平台应用开发的需求日益增长&#…

Python基础核心知识点(建议收藏再用)

目录 一、python入门day1-day24 day01-03 编程语言day04 变量day05 垃圾回收机制&#xff08;GC机制&#xff09; 1 引用计数2 标记清除3 分代回收 day05 程序交互与基本运算符day06 可变不可变类型day07 流程控制 1 赋值 2 浅拷贝 copy3 深拷贝 deepcopy day08-10 基本数据类…

ES数据类型学习之keyword和text以及查询条件match和term

es&#xff08;4&#xff09;—查询条件match和term_es match term-CSDN博客 参考文章如上。开始学习 1.text和keyword的学习 直接上官网Text type family | Elasticsearch Guide [7.17] | Elastic Text type family The text family includes the following field types: …

默克索引轻松搞定,快速查找!

在化学、药学和生物科学领域&#xff0c;有一部被广泛认可的权威工具书——《默克索引》&#xff08;Merck Index&#xff09;。自1889年首次出版以来有130多年的历史&#xff0c;《默克索引》一直被视为化学品、药物和生物制品的关键物理、药理和历史信息的最权威、最可靠的来…

Ubuntu22.04安装NVIDIA Driver和CUDA

Ubuntu22.04安装NVIDIA Driver和CUDA 1.安装NVIDIA Driver(1).卸载Ubuntu自带的驱动程序&#xff1a;(2).禁用nouveau:(3).安装相应的NVIDIA Driver: 2.安装CUDA(1).下载并安装CUDA:(2).配置环境变量&#xff1a; 本文记录了在 "Ubuntu22.04"上安装 "NVIDIA D…

百度关掉Ai智能回答(保姆级技术文,解决过程完整记录)

随着AI时代到来&#xff0c;百度也是不肯落于人后&#xff0c;在其搜索页面推出了AI自动回答。点到这里的你想必正因此懊恼&#xff0c;你说它怎么切入不好&#xff0c;非得搞个东西在那一直跳&#xff0c;顶着下面的内容哐哐直跳&#xff0c;你想好好浏览内容还得等它跳消停了…

C++(week15): C++提高:(四)并发服务器架构模型

文章目录 一、五种网络IO模型1.数据传输过程2.两组重要概念3.五种网络IO模型(1)阻塞式IO(2)非阻塞式IO(3)IO多路复用(4)信号驱动IO(5)异步IO 4.五种网络IO模型的对比5.举例说明 二、并发服务器模型1.循环式迭代式模式2.并发式服务器3.prefork服务器4.反应式服务器 (Reactor)5.反…

协同过滤推荐算法(包括传统协同过滤、矩阵分解、NeuralCF)

一、什么是协同过滤推荐算法 传统的协同过滤&#xff08;Collaborative Filtering, CF&#xff09;是一种推荐系统技术&#xff0c;它基于用户的历史行为数据来预测用户对未评分项目的潜在兴趣。 “协同大家的反馈、评价和意见一起对海量的信息进行过滤&#xff0c;从中筛选出…

IPD如何通过数字化项目管理平台落地实施?

随着市场竞争的日益激烈&#xff0c;企业对于产品研发的效率和质量逐渐提高&#xff0c;越来越多的企业关注到IPD(Integrated Product Development)&#xff0c;希望参考IPD体系的方法理念和实践经验&#xff0c;从而帮助企业快速响应市场变化、缩短产品开发周期、提升产品开发…

step9:设置软件初始状态获取时不发送配置指令

文章目录 文章介绍问题描述效果图 解决办法下拉框控件ComboBox切换开关组件Switch数值微调框控件SpinBox 文章介绍 问题描述 虚拟端口&#xff08;硬件&#xff09;发送信号给客户端电脑&#xff0c;会设置此时硬件的各种基础参数&#xff0c; 客户端软件被设置基础参数之后&a…

计算机视觉——凸包计算

现在有一大堆点&#xff0c;然后你要找出一个可以围住这些点且面积最小的凸多边形&#xff0c;这个凸多边形称为凸包。 显而易见&#xff0c;如果要面积最小&#xff0c;那凸包的顶点势必得是这一大堆点的几个点&#xff0c;你也可以想成是用一条橡皮筋把这些点圈起来。 先把各…

什么是云原生?(一)

1. 前言 停下手头的工作&#xff0c;让你的同事定义“云原生”一词。你很可能会得到几个不同的答案。 1.1 让我们从一个简单的定义开始&#xff1a; 云原生架构和技术是一种设计、构建和操作在云中构建并充分利用云计算模型的工作负载的方法。 1.2 云原生计算基金会给出了官方…