OpenCV-Python(19):Canny边缘检测

news2025/2/3 13:23:01

目录

 学习目标

Canny 边缘检测原理

1.噪声抑制(噪声去除)

2.梯度计算

3.非极大值抑制

4.双阈值检测(滞后阈值)

5.边缘连接

Canny 边缘检测步骤

Canny 边缘检测的OpenCV实现 

不同阈值的边缘检测效果


学习目标

  • 了解Canny边缘检测的概念
  • 学习掌握函数cv2.Canny()的用法

Canny 边缘检测原理

        Canny 边缘检测是一种非常流行的边缘检测算法,是John F.Canny 在1986 年提出的。它是一个有很多步构成的算法,该算法的原理基于以下几个关键思想,我们接下来会分步介绍。

1.噪声抑制(噪声去除)

        由于边缘检测很容易受到噪声影响,在进行边缘检测之前,一般先使用高斯滤波器对图像进行平滑处理(通常使用5*5的核),以减少噪声的影响。高斯滤波器可以有效地模糊图像,同时保留边缘的细节。

2.梯度计算

        对平滑后的图像使用Sobel算子(Sobel算子是一种线性滤波器,可以检测图像中的边缘)计算图像在水平和垂直方向上的一阶导数(图像梯度),根据得到的两幅梯度图Gx和Gy找到边界的梯度和方向,公式如下:

梯度的方向一般总是与边界垂直。梯度方向归为四类:垂直、水平和两个对角线。 

3.非极大值抑制

        在获得梯度的方向和大小之后,应该对整幅图像做一个扫描,去除那些非边界上的点。对每一个像素进行检查,看这个点的梯度是不是周围具有相同梯度方向的点中最大的(选择梯度最大的像素作为边缘点,从而抑制非边缘点)。如下图所示:

4.双阈值检测(滞后阈值)

        为了确定哪些边界才是真正的边界,需要设定两个阈值minVal 和maxVal。当图像的灰度梯度高于maxVal 时,被认为为是真的边界,那些低于minVal 的边界界会被抛弃。如果介于两者之间的就要看这个点是否与某个被确定为真正的边界点相连,如果是就认为它也是边界点,如果不是就抛弃。如下图:

A 高于阈值maxVal 所以是真正的边界点,C 虽然低于maxVal 但由于高于minVal 并且与A 相连,所以也被认为为是真正的边界点。而B 就会抛弃,因为它不仅低于maxVal 而且不与真正的边界点相连。所以选择合适的maxVal和minVal 对于能否得到好的结果非常重要。在这一步一些小的噪声点也会被除去,因为我们假设边界都是一些比较长的线 段。

5.边缘连接

        通过迭代地访问弱边缘像素,并与其相邻的强边缘像素进行连接,最终确定真正的边缘。

Canny 边缘检测步骤

  1. 将输入图像转换为灰度图像,因为Canny边缘检测只适用于单通道灰度图像。
  2. 对灰度图像进行高斯滤波,以减少图像中的噪声。高斯滤波可以使用cv2.GaussianBlur()函数实现。
  3. 使用Sobel算子计算图像的梯度。Sobel算子可以分别计算图像在水平和垂直方向上的梯度。这可以通过cv2.Sobel()函数实现。
  4. 根据梯度幅值和方向计算边缘的强度和方向。幅值较大的像素被认为是边缘像素,而幅值较小的像素被认为是非边缘像素。
  5. 应用非极大值抑制,以消除边缘响应中的次要边缘。这可以通过比较每个像素的梯度方向与其相邻像素的梯度方向来实现。
  6. 应用双阈值来确定真正的边缘。将像素分为强边缘、弱边缘和非边缘三类。强边缘像素被认为是真正的边缘,弱边缘像素需要进一步确认,非边缘像素被排除。
  7. 使用连接弱边缘像素的方法来连接真正的边缘。这可以通过迭代地访问弱边缘像素并检查其相邻像素的强边缘状态来实现。
  8. 最后,得到的边缘图像包含了检测到的边缘。

注意:Canny边缘检测的结果通常是二值图像,其中边缘像素为白色,非边缘像素为黑色。

Canny 边缘检测的OpenCV实现 

        在OpenCV 中只需要一个函数cv2.Canny()就可以完成以上几步,该函数是OpenCV中用于执行Canny边缘检测的函数。其语法如下:

edges = cv2.Canny(image, threshold1, threshold2, apertureSize=None, L2gradient=None)

参数说明:

  • image:要进行边缘检测的输入图像。必须是单通道灰度图像
  • threshold1:第一个阈值,用于边缘链接。较低的阈值用于检测强边缘。
  • threshold2:第二个阈值,用于边缘链接。较高的阈值用于检测弱边缘,并将其链接到强边缘。
  • apertureSize:可选参数,Sobel算子的孔径大小。默认值为3。
  • L2gradient:可选参数,指定计算梯度幅值的方法。如果为True,则使用更精确的L2范数进行计算。默认值为False,使用以下方式计算:

cv2.Canny()函数将返回一个二值图像,其中包含检测到的边缘。

下面是一个使用cv2.Canny()函数进行Canny边缘检测的示例:

import cv2

# 读取图像
img = cv2.imread('image.jpg', cv2.IMREAD_GRAYSCALE)

# 进行Canny边缘检测
edges = cv2.Canny(img, 100, 200)

# 显示结果图像
cv2.imshow('Canny Edge Detection', edges)
cv2.waitKey(0)
cv2.destroyAllWindows()

上述代码中的image.jpg是待处理的图像文件路径,你需要将其替换为你自己的图像文件路径。该示例将使用阈值100200进行Canny边缘检测,并显示结果图像。你可以根据需要调整阈值以获取更好的边缘检测结果。

不同阈值的边缘检测效果

下面是使用滑动条进行Canny边缘检测的Python代码示例,可以通过调节滑动条来设置阈值minVal 和maxVal 的大小来进行Canny 边界检测:

import cv2
import numpy as np

def nothing(x):
    pass

# 创建窗口和滑动条
cv2.namedWindow('Canny Edge Detection')
cv2.createTrackbar('minVal', 'Canny Edge Detection', 0, 255, nothing)
cv2.createTrackbar('maxVal', 'Canny Edge Detection', 0, 255, nothing)

# 读取图像
img = cv2.imread('lena.jpg', cv2.IMREAD_GRAYSCALE)

while True:
    # 获取滑动条的值
    minVal = cv2.getTrackbarPos('minVal', 'Canny Edge Detection')
    maxVal = cv2.getTrackbarPos('maxVal', 'Canny Edge Detection')

    # 使用滑动条的值进行Canny边缘检测
    edges = cv2.Canny(img, minVal, maxVal)

    # 显示结果图像
    cv2.imshow('Canny Edge Detection', edges)

    # 按下ESC键退出循环
    if cv2.waitKey(1) == 27:
        break

        在运行代码时,会弹出一个名为"Canny Edge Detection"的窗口,其中包含两个滑动条用于调节Canny边缘检测的阈值。通过调整滑动条的值,你可以实时查看Canny边缘检测的结果,这样你就会理理解阈值的重要性了,按下ESC键可退出循环。以下是运行效果图:

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

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

相关文章

Django(二)

1.django框架 1.1 安装 pip install django3.21.2 命令行 创建项目 cd 指定目录 django-admin startproject 项目名mysite ├── manage.py [项目的管理工具] └── mysite├── __init__.py├── settings.py 【配置文件,只有一部分…

电子科大软件测试~第三次作业

第三次作业 第一题 采用JUnit软件测试框架进行测试程序编程,实现对下面java程序进行单元测试,找出其中缺陷。然后修改缺陷,直到通过单元测试,给出测试程序脚本和运行结果界面。 public class getMax {public int get_max(int x…

Redis实现日榜|直播间榜单|排行榜|Redis实现日榜01

前言 直播间贡献榜是一种常见的直播平台功能,用于展示观众在直播过程中的贡献情况。它可以根据观众的互动行为和贡献值进行排名,并实时更新,以鼓励观众积极参与直播活动。 在直播间贡献榜中,每个观众都有一个对应的贡献值&#…

这样使用云渲染又快又省钱

我们都知道使用云渲染是要钱的,而且渲染的时间越久,需要的渲染费越多,哪么如何又快又省钱的拿到效果图呢?用炫云的渲染质量,保准让你使用云渲染渲染效果图又快又省钱。 我们使用炫云的时候,根据自己的需求…

输入框获取焦点

Entry Component struct Test {build() {Row() {Column({ space: 5 }) {//Text("自定义样式").customStyles(20,Color.Yellow).backgroundColor("#36D").padding(10).borderRadius(30)TextInput({placeholder: "获取焦点"}).borderColor(Color.Y…

LLM微调(四)| 微调Llama 2实现Text-to-SQL,并使用LlamaIndex在数据库上进行推理

Llama 2是开源LLM发展的一个巨大里程碑。最大模型及其经过微调的变体位居Hugging Face Open LLM排行榜(https://huggingface.co/spaces/HuggingFaceH4/open_llm_leaderboard)前列。多个基准测试表明,就性能而言,它正在接近GPT-3.5…

图灵日记之java奇妙历险记--数据类型与变量运算符

目录 数据类型与变量字面常量数据类型变量语法格式整型变量浮点型变量字符型变量希尔型变量类型转换自动类型转换(隐式)强制类型转换(显式) 类型提升不同数据类型的运算小于4字节数据类型的运算 字符串类型 运算符算术运算符关系运算符逻辑运算符逻辑与&&逻辑或||逻辑非…

案例125:基于微信小程序的个人健康数据管理系统的设计与实现

文末获取源码 开发语言:Java 框架:SSM JDK版本:JDK1.8 数据库:mysql 5.7 开发软件:eclipse/myeclipse/idea Maven包:Maven3.5.4 小程序框架:uniapp 小程序开发软件:HBuilder X 小程序…

【论文阅读】FreeU: Free Lunch in Diffusion U-Net

FreeU: 无需训练直接提升扩散模型生成效果。 paper:https://arxiv.org/abs/2309.11497 code:GitHub - ChenyangSi/FreeU: FreeU: Free Lunch in Diffusion U-Net 1. 介绍 贡献: •研究并揭示了U-Net架构在扩散模型中去噪的潜力&#xff0…

目标检测入门体验,技术选型,加载数据集、构建机器学习模型、训练并评估

Hi, I’m Shendi 1、目标检测入门体验,技术选型,加载数据集、构建机器学习模型、训练并评估 在最近有了个物体识别的需求,于是开始学习 在一番比较与询问后,最终选择 TensorFlow。 对于编程语言,我比较偏向Java或nod…

vue关闭当前路由页面并跳转到其父页面

1.dom中添加关闭或取消按钮 <el-button type"primary" class"blueLinearbg cancelBtn" click"cancel" >取 消</el-button>2.cancel方法中 /*取消或关闭*/cancel(){this.$store.dispatch("tagsView/delView", this.$route)…

state的保留与重置

让组件状态保留的情况&#xff1a; 让组件状态重置的3种情况&#xff1a;

[NISACTF 2022]easyssrf

[NISACTF 2022]easyssrf wp ssrf 的题目&#xff0c;提示了会使用 curl 连接输入的网站并返回响应包。 测试连接百度 直接在输入框中写 www.baidu.com 是无法连接的&#xff0c;需要在前面加入 http 或者 https &#xff0c;因为 curl 的使用方式就是&#xff1a; curl htt…

从0到1部署gitlab自动打包部署项目

本文重点在于配置ci/cd打包 使用的是docker desktop 第一步安装docker desktop Docker简介 Docker 就像一个盒子&#xff0c;里面可以装很多物件&#xff0c;如果需要某些物件&#xff0c;可以直接将该盒子拿走&#xff0c;而不需要从该盒子中一件一件的取。Docker中文社区、…

Ubuntu 常用命令之 man 命令用法介绍

&#x1f4d1;Linux/Ubuntu 常用命令归类整理 man命令在Ubuntu系统中是一个非常重要的命令&#xff0c;它用于查看系统的手册页。手册页是Linux和Unix系统中的一种在线文档&#xff0c;用于描述系统中的命令、函数、配置文件等的详细信息。 man命令的基本格式是 man [选项] …

光伏企业如何能够提高光伏电站的建设效率?

随着全球对可再生能源需求的日益增长&#xff0c;光伏行业的发展势头强劲。然而&#xff0c;光伏电站建设过程中往往存在效率低下的问题&#xff0c;这不仅影响了电站的运营成本&#xff0c;也制约了整个行业的发展速度。因此&#xff0c;如何提高光伏电站的建设效率&#xff0…

DshanMCU-R128s2 Hello World!

本文将介绍使用 R128 开发板从串口输出 Hello World 的方式介绍 SDK 软件开发流程。 载入方案 我们使用的开发板是 R128-Devkit&#xff0c;需要开发 C906 核心的应用程序&#xff0c;所以载入方案选择r128s2_module_c906 $ source envsetup.sh $ lunch_rtos 1编辑程序 打…

Windows 系统下本地单机搭建 Redis(一主二从三哨兵)

目录 一、Redis环境准备&#xff1a; 1、下载redis 2、Windows下的.msi安装和.zip格式区别&#xff1a; 二、哨兵介绍&#xff1a; 1、一主二从三哨兵理论图&#xff1a; 2.哨兵的主要功能&#xff1a; 3.哨兵用于实现 redis 集群的高可用&#xff0c;本身也是分布式的&…

锐捷配置PVLAN

一、实验拓扑 二、实验目的 PVLAN可以通过主VLAN和辅助VLAN的概念&#xff0c;部署隔离技术&#xff0c;实现用户间的互访控制。 三、实验配置 SW2 Ruijie >enable Ruijie #configure terminal Ruijie (config)#vlan 20 Ruijie (config-vlan)#private-vlan community …

喜报|迪捷软件“ModelCoder 建模及形式化验证代码生成软件”荣登浙江省首版次产品目录

近日&#xff0c;浙江省经济和信息化厅公布《2023年浙江省首版次软件产品应用推广指导目录》&#xff0c;浙江迪捷软件科技有限公司的“ModelCoder 建模及形式化验证代码生成软件”经过多轮审核及专家评定被纳入目录&#xff0c;这是迪捷软件自主研发的产品继“天目全数字实时仿…