【OpenCV】Canny边缘检测

理论

Canny 边缘检测是一种流行的边缘检测算法。它是由 John F. Canny 在 1986 年提出。

  1. 这是一个多阶段算法,我们将介绍算法的每一个步骤。

  2. 降噪

    由于边缘检测易受图像中的噪声影响,因此第一步是使用 5x5 高斯滤波器去除图像中的噪声。我们在前面的章节中已经介绍到了这一点。

  3. 寻找图像的强度梯度

    然后在水平和垂直方向上用 Sobel 内核对平滑后的图像进行滤波,以获得水平方向(​编辑)和垂直方向(​编辑)的一阶导数。从这两个图像中,我们可以找到每个像素的边缘梯度和方向

渐变方向始终垂直于边缘。它被四舍五入到表示垂直,水平和两个对角线方向的四个角度中的一个。
  1. 非最大抑制

    在获得梯度幅度和方向之后,完成图像的全扫描以去除可能不构成边缘的任何不需要的像素。为此,在每个像素处,检查像素是否是其在梯度方向上的邻域中的局部最大值。检查下图:

    nms.jpg

    A 点位于边缘(垂直方向)。渐变方向与边缘垂直。 B 点和 C 点处于梯度方向。因此,用点 B 和 C 检查点 A,看它是否形成局部最大值。如果是这样,则考虑下一阶段,否则,它被抑制(归零)。

    简而言之,您得到的结果是具有“细边”的二进制图像。

  2. 滞后阈值

    这个阶段决定哪些边缘都是边缘,哪些边缘不是边缘。为此,我们需要两个阈值,minVal 和 maxVal。强度梯度大于 maxVal 的任何边缘肯定是边缘,而 minVal 以下的边缘肯定是非边缘,因此被丢弃。位于这两个阈值之间的人是基于其连通性的分类边缘或非边缘。如果它们连接到“可靠边缘”像素,则它们被视为边缘的一部分。否则,他们也被丢弃。见下图:

    hysteresis.jpg

    边缘 A 高于 maxVal,因此被视为“确定边缘”。虽然边 C 低于 maxVal,但它连接到边 A,因此也被视为有效边,我们得到完整的曲线。但是边缘 B 虽然高于 minVal 并且与边缘 C 的区域相同,但它没有连接到任何“可靠边缘”,因此被丢弃。因此,我们必须相应地选择 minVal 和 maxVal 才能获得正确的结果。

    在假设边是长线的情况下,该阶段也消除了小像素噪声。

所以我们最终得到的是图像中的强边缘。

OpenCV 中的 Canny 边缘检测

OpenCV 将以上所有内容放在单个函数中, cv.Canny() 。我们将看到如何使用它。第一个参数是我们的输入图像。第二个和第三个参数分别是我们的 minVal 和 maxVal。第三个参数是 aperture_size。它是用于查找图像渐变的 Sobel 内核的大小。默认情况下,它是 3.最后一个参数是 L2gradient,它指定用于查找梯度幅度的等式。

import numpy as np
import cv2 as cv
from matplotlib import pyplot as plt
img = cv.imread('messi5.jpg',0)
edges = cv.Canny(img,100,200)
plt.subplot(121),plt.imshow(img,cmap = 'gray')
plt.title('Original Image'), plt.xticks([]), plt.yticks([])
plt.subplot(122),plt.imshow(edges,cmap = 'gray')
plt.title('Edge Image'), plt.xticks([]), plt.yticks([])
plt.show()

结果如图所示:

canny1.jpg

apachecn.github.io/opencv-doc-zh/#/

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

gitee常见命令

目录 1.本地分支重命名 2.更新远程仓库分支 3.为当前分支设置远程跟踪分支 4.撤销已经push远程的代码 5.idea->gitee的‘还原提交’ 需要和本地当前的代码解决冲突 解决冲突 本地工作区的差异代码显示 本地commit和push远程 6.idea->gitee的‘将当前分支重置到此…

Ultra-Fast-Lane-Detection复现、部署及训练

Ultra-Fast-Lane-Detection复现、训练及部署 一、复现二、训练三、部署 一、复现 Github下载源码:https://github.com/cfzd/Ultra-Fast-Lane-Detection (1)将GPU运算改为CPU运算:.cuda() -> .to(‘cpu’) test.py中33行&…

【Java计算机毕业设计】基于SSM+VUE宠物领养管理系统【源代码+数据库+LW文档+开题报告+答辩稿+部署教程+代码讲解】

源代码数据库LW文档(1万字以上)开题报告答辩稿 部署教程代码讲解代码时间修改教程 一、开发工具、运行环境、开发技术 开发工具 1、操作系统:Window操作系统 2、开发工具:IntelliJ IDEA或者Eclipse 3、数据库存储&#xff1a…

工业异常检测-CVPR2024-新的3D异常数据合成办法和自监督网络IMRNet

论文:https://arxiv.org/pdf/2311.14897v3.pdf 项目:https://github.com/chopper-233/anomaly-shapenet 这篇论文主要关注的是3D异常检测和定位,这是一个在工业质量检查中至关重要的任务。作者们提出了一种新的方法来合成3D异常数据&#x…

Linux-ubuntu环境配置

一,安装VWware,里面导入镜像文件 这些都是文件夹里面有的,然后对着正点原子视频安装就行,虚拟机的破解码,去百度搜一个能用就行,中间遇见俩问题。①乌班图里面不能上网,②插入U盘后,…

Python Selenium 各浏览器驱动下载与配置使用(详细流程)

大家好啊!我是NiJiMingCheng 这是我的博客:NiJiMingCheng 这节课我们来学习安装selenium和对应的各个浏览器驱动,个人比较喜欢使用谷歌浏览器驱动,所以接下来以谷歌浏览器来为大家做示例!!! Sel…

工具学习_Buildroot

0. 工具概述 Buildroot 是一个简单、高效且易于使用的工具,旨在通过交叉编译生成嵌入式 Linux 系统。它支持生成交叉编译工具链、根文件系统、内核镜像以及引导加载器。通过类似于内核配置的菜单界面(menuconfig、gconfig、xconfig)&#xf…

【机器人】系统辨识之激励轨迹设计(傅里叶级数)

在机器人参数辨识中使用傅里叶级数,主要是为了生成一种激励轨迹,具有良好的数学特性,同时符合物理要求。傅里叶级数的特性使其在机器人动力学辨识的激励轨迹设计中非常常用。 1. 为什么需要激励轨迹? 激励轨迹的作用是通过驱动机…

Unity简单操作及使用教程

Unity 是一款强大的跨平台游戏引擎,它不仅支持 2D 和 3D 游戏的开发,还可以用于虚拟现实 (VR)、增强现实 (AR)、动画、建筑可视化等多个领域。Unity 提供了完整的开发环境,具有丰富的功能、工具和资源,可以帮助开发者快速实现创意…

前端node环境安装:nvm安装详细教程(安装nvm、node、npm、cnpm、yarn及环境变量配置)

需求:在做前端开发的时候,有的时候 这个项目需要 node 14 那个项目需要 node 16,我们也不能卸载 安装 。这岂不是很麻烦。这个时候 就需要 一个工具 来管理我们的 node 版本和 npm 版本。 下面就分享一个 nvm 工具 用来管理 node 版本。 这个…

为什么数据平台需要敏捷版|直播回顾

11月28日,我们邀请到StartDT合伙人、CTO地雷和StartDT资深战略咨询专家何夕,围绕“为什么数据平台需要敏捷版”这个话题,向大家汇报了DataSimba敏捷版这半年来的最新进展,并带来了详细的产品解读。 敏捷版支持StarRocks、ClickHo…

HarmonyOS-中级(四)

文章目录 Native适配开发三方库的基本使用 🏡作者主页:点击! 🤖HarmonyOS专栏:点击! ⏰️创作时间:2024年12月09日11点12分 Native适配开发 Node-API HarmonyOS Node-API 是 HarmonyOS 提供的…

从零开始的使用SpringBoot和WebSocket打造实时共享文档应用

在现代应用中,实时协作已经成为了非常重要的功能,尤其是在文档编辑、聊天系统和在线编程等场景中。通过实时共享文档,多个用户可以同时对同一份文档进行编辑,并能看到其他人的编辑内容。这种功能广泛应用于 Google Docs、Notion 等…

统信桌面专业版部署postgresql-14.2+postgis-3.2方法介绍

文章来源:统信桌面专业版部署postgresql-14.2postgis-3.2方法介绍 | 统信软件-知识分享平台 应用场景 CPU架构:X86(海光C86-3G 3350) OS版本信息:1070桌面专业版 软件信息:postgresql-14.2postgis-3.2 …

jmeter 提取数据写入文件

BeanShell PostProcessor FileWriter file new FileWriter("E:\\IOT\\cui家庭中心\\v3.8.0\\123.txt",true); BufferedWriter out new BufferedWriter(file); out.write(vars.get("localKey")"\n"); log.info("到这里了吗"); out.c…

在ensp中ACL路由控制实验

一、实验目的 掌握ACL路由控制管理 二、实验要求 要求: 配置路由策略,左右两边不公开区域对方不可达,其他区域可以互相ping通 设备: 1、三台路由器 2、四台交换机 3、四台电脑 4、四台服务器 使用ensp搭建实验环境,如图所…

MySQL 实现分库分表详解

MySQL 实现分库分表详解 为什么要分库分表什么是分库分表分库分表的几种方式垂直拆分数据库垂直拆分表垂直拆分垂直拆分特点垂直拆分优缺点优点缺点 水平拆分数据库水平拆分表水平拆分水平拆分的其他方式水平拆分特点水平拆分优缺点优点缺点 分库分表带来的问题分库分表技术如何…

如何让Google快速收录你的页面?

要让Google更快地收录你的网站内容,首先需要理解“爬虫”这个概念。Google的爬虫是帮助它发现和评估网站内容质量的工具,如果你的页面质量高且更新频率稳定,那么Google爬虫更可能频繁光顾。通常情况下,通过Google Search Console&…

游戏引擎学习第36天

仓库 :https://gitee.com/mrxiao_com/2d_game 回顾之前的内容 在这个程序中,目标是通过手动编写代码来从头开始制作一个完整的游戏。整个过程不使用任何库或现成的游戏引擎,这样做的目的是为了能够全面了解游戏执行的每一个细节。开发过程中&#xff0…

【Linux】系统信息和状态命令

步骤 1:显示系统信息 命令: uname -a 1.打开终端。 2.输入命令并按回车键。 3.观察:输出将显示包括内核版本、主机名、硬件架构等在内的系统信息。 步骤 2:显示或设置系统的主机名 命令: hostname 1.打开终端。…