Opencv(C++)笔记--Canny边缘检测算法

news2025/2/1 17:04:18

目录

1--算法原理

2--Opencv API

3--代码实例


1--算法原理

具体原理讲解可参考博客1 和 博客2,算法主要步骤如下:

        ① 使用高斯模糊(高斯滤波)去除噪声;

        ② 进行灰度转换,转换为灰度图;

        ③ 计算梯度,首先使用 Sobel 算子 Gx 和 Gy 分别计算 Grad_x 和 Grad_y,接着计算梯度Grad_xy 及 梯度方向 θ;

        ④ 进行非最大信号抑制,保留一定范围内(例如3×3邻域)像素值最大的像素点,其余像素点的像素值置0;

        ⑤ 设置高低阈值,输出二值图像;抑制(去除)梯度值小于低阈值的像素点;梯度值大于高阈值的像素点保留为强边缘点;梯度值介于低阈值和高阈值之间的像素点,保留为弱边缘,需要进行进一步的处理;

        ⑥ 弱边缘抑制,对第 ⑤ 步的弱边缘点进行进一步的处理,如果弱边缘点在规定邻域内(例如3×3邻域)存在强边缘点邻居,则正式保留为真实边缘点,否则进行抑制(剔除);

需要强调的是非最大信号(非极大值)抑制的原理:

        非极大抑制(Non-Maximum Suppression,NMS)指的是遍历图像中的所有像素点,判断当前像素点是否是周围像素点中的最大值(具有相同方向梯度);如果当前像素点的梯度最大,则保留像素点,否则就抑制(剔除,像素值置0),这一步的目的往往是将模糊的边界变得清晰;

2--Opencv API

需要说明的是,高阈值(API中的 threshold2)通常设置为低阈值(API中的 threshold1)的2~3倍;

3--代码实例

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

cv::Mat gray_src;
int thresh = 50; // 初始阈值
int max_value = 255; // 最大阈值

void Canny_Demo(int, void*){
    cv::Mat edge;
    cv::blur(gray_src, gray_src, cv::Size(3, 3), cv::Point(-1, -1), cv::BORDER_DEFAULT); // 先进行简单滤波去除噪声
    cv::Canny(gray_src, edge, thresh, thresh*2, 3, false); // 调用 API 实现边缘检测
    cv::imshow("output", edge);
}

int main(int argc, char** argv){
    cv::Mat src;
    src = cv::imread("C:/Users/Liujinfu/Desktop/opencv_bilibili/test1.jpg");
    if (src.empty()){
        printf("could not load image..\n");
        return -1;
    }
    cv::imshow("input", src);
    
    cv::cvtColor(src, gray_src, cv::COLOR_BGR2GRAY); // 灰度化

    cv::namedWindow("output");
    cv::createTrackbar("low_Thresh: ", "output", &thresh, max_value, Canny_Demo); 
    Canny_Demo(0, 0);
    
    cv::waitKey(0);
    return 0;
}

 

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

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

相关文章

数据结构---动态规划

动态规划爬楼梯问题解法1第一步第二步第三步JAVA实现解法2问题建模最优子结构边界状态转移公式求解问题递归JAVA实现备忘录算法JAVA实现解法三JAVA实现&#xff08;斐波那契数列&#xff09;国王和金矿一个错误的解法排列组合解法JAVA实现动态规划爬楼梯问题 有一座高度是10级…

rk3568 添加gc2053摄像头驱动

在设备树文件代码中添加 gc2053 设备节点 &i2c2 {status "okay";pinctrl-0 <&i2c2m1_xfer>;/* split mode: lane0/1 */gc2053: gc205337 {status "okay";compatible "galaxycore,gc2053";// 需要与驱动中的匹配字符串一致reg …

高级篇-rabbitmq的高级特性

1.消息可靠性 三种丢失的情形&#xff1a; 1.1 生产者确认机制 启动MQ 创建Queues&#xff1a; 两种Callback: 1.ReturnCallback:全局callback 2.ComfirmCallback: 发送信息时候设置 Testpublic void testSendMessage2SimpleQueue() throws InterruptedException {// 1.…

第八章练习题-3

目录 第十三题 题目 Student类 Teacher类 main类 老师的代码 Student类 Teacher类 main类 第七问&#xff1a;定义多态数组 main类 运行结果 问题 原因 解决办法 老师代码&#xff1a;main类 结果 第八问 运行结果 第十四题 第十五题 题目 方法的多态…

HFSS使用经验三

目录 一、如何量取HFSS某一点的空间位置 二、如何快速的切换视图 三、HFSS中绘制圆柱体 四、如何修改HFSS的仿真线程数量 五、HFSS中如何选取挖空的面 六、HFSS中如何实现参数扫描 一、如何量取HFSS某一点的空间位置 右击可以点击Measure按键 鼠标放到特殊点&#xff0c…

2023年申请发明专利的重要性和注意问题。

随着对知识产权意思的逐步提高&#xff0c;企业对知识产权越来越关心。知识产权包括专利权、商标权和著作权。专利包含发明专利专利、实用新型专利、外观设计专利。其中发明专利的申请难度最大&#xff0c;含金量最高。根据小编申请发明专利方面20年的经验&#xff0c;简单介绍…

【Windows|WSL|Ubuntu|VSCode】流程记录|坑点模糊回忆

无限踩坑&#xff0c;悲惨回忆&#xff0c;又似乎毫无意义&#xff1f; 1.安装WSL 官方文档&#xff1a;Install WSL | Microsoft Learn 简单来说&#xff0c;管理员身份运行PowerShell wsl --install 通常需要wsl2&#xff0c;得益于其优势&#xff0c;通过 PowerShell w…

用ERP系统做数据管理对企业有什么好处?

ERP系统数据管理解决方案是以业务为主导的工具&#xff0c;为所有的业务流程和操作创建一个单一的主记录&#xff0c;包括来自各种内部和外部应用和来源的人员和系统。 大多数企业采用不同的系统&#xff0c;包含客户、产品、销售、交易等信息数据存储在许多不同的地方&#…

葵花宝典之C语言冷知识(二)

目录 &#x1f693;&#xff08;一&#xff09;图形的打印 &#x1f699;判断类型 &#x1f68c;逻辑简单易找规律型。 &#x1f68c;存在坐标规律的图案打印 &#x1f693;&#xff08;二&#xff09;中值的表达形式 &#x1f699;(xy)/2 表达错误的原因 &#x1f699;有符号数…

Python编程课程好学吗?能学会吗?

Python编程课程好学吗&#xff1f;能学会吗&#xff1f;Python是一种计算机程序设计语言&#xff0c;一种面向对象的动态类型语言&#xff0c;最初被设计用于编写自动化脚本(shell)&#xff0c;随着版本的不断更新和语言新功能的添加越来越多被用于独立的大型项目的开发。 编程…

mvn和npm的那些事

1 mvn简介 mvn就好比java中的maven,用于管理包版本,mvn用于管理node版本,而npm来源于node中,比如用于拉取仓库中的依赖包,在构建使用项目时可以选择指定的版本,从而避免编译出错运行失败等问题 Node.js17或更高版本中出现Error: error:0308010C:digital envelope routine…

CSDN如何使用Markdown编辑器

这里写自定义目录标题欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题&#xff0c;有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注…

Pytest自动化测试 - 完美结合Allure

简介 Allure Framework是一种灵活的、轻量级、多语言测试报告工具。 不仅可以以简洁的网络报告形式非常简洁地显示已测试的内容&#xff0c; 而且还允许参与开发过程的每个人从日常执行中提取最大程度的有用信息和测试。 从开发/测试的角度来看&#xff1a; Allure报告可以…

四大蓝牙天线设计方式

https://www.elecfans.com/d/686538.html 一直以来&#xff0c;无论是智能手机&#xff0c;还是笔记本电脑&#xff0c;亦或是平板电脑&#xff0c;蓝牙都是智能设备的标配。随着移动互联网的发展&#xff0c;现在涌现出大量的智能可穿戴设备&#xff0c;而支撑这些应用的发展不…

Spring AOP源码解析——专治你不会看源码的坏毛病!

虽然现在大厂内卷现象泛滥&#xff0c;而且996的传统依旧肆虐。但没有哪位程序员能架得住互联网大厂的高薪职位诱惑。特别是我还有一位在阿里工作7年多的老表&#xff0c;在其耳旁风之下&#xff0c;不断将大厂描绘的美丽风景刻画在我脑海中&#xff0c;也让我一直有着想进大厂…

架构设计(八):数据库的水平扩展和垂直扩展

架构设计&#xff08;八&#xff09;&#xff1a;数据库的水平扩展和垂直扩展 作者&#xff1a;Grey 原文地址&#xff1a; 博客园&#xff1a;架构设计&#xff08;八&#xff09;&#xff1a;数据库的水平扩展和垂直扩展 CSDN&#xff1a;架构设计&#xff08;八&#xf…

Redis6入门到实战------ 三、常用五大数据类型(列表(List)、集合(Set)、哈希(Hash)、Zset(sorted set))

3 Redis列表(List) 3.1 简介 单键多值 Redis 列表是简单的字符串列表&#xff0c;按照插入顺序排序。你可以添加一个元素到列表的头部&#xff08;左边&#xff09;或者尾部&#xff08;右边&#xff09;。 它的底层实际是个双向链表&#xff0c;对两端的操作性能很高&#x…

组件技术--设计--MVC模式+DAO+MySQL+jsp+servlet 简单的购物车案例

MVC模式DAOMySQLjspservlet 简单的购物车案例题外话购物车案例需求核心系统组成Javaweb项目框架基本思想核心代码DaoBookDaolistenerSessionListenerservletAddServletInitServletRemoveServletvoBook.jspbuyForm.jspshowAllBook.jspshowCart.jsptargetpom.xmlWEB-INFweb.xmlli…

python绘图——坐标轴

1. 2D坐标轴 1.1 绘制简单的曲线 import matplotlib.pyplot as plt import numpy as np xnp.linspace(-1,1,50)#-1到1中画50个点 yx**2 plt.plot(x,y,colorgreen) plt.tick_params(axisx,colorsblue) plt.tick_params(axisy,colorsred) plt.show()作图&#xff1a; 1.2 坐标…

游戏开发 LinkedList

inkedList底层是双向链表&#xff0c;一个节点挂着一个节点LinkedList不需要设定长度&#xff0c;不需要扩容LinkedList 的优缺点 优点 ① 往里面插入一些元素的时候不需要像ArrayList数组那样需要挪动大量的元素了&#xff0c;直接在链表里加入一个节点就可以了 ② 如果要不断…