opencv基础44- Canny边缘检测详解-cv.Canny()

news2024/10/6 16:30:22

什么是Canny边缘检测?

Canny边缘检测是一种经典的边缘检测算法,由John F.
Canny在1986年提出。它被广泛应用于计算机视觉和图像处理领域,是一种多阶段的边缘检测算法,能够有效地检测图像中的边缘并抑制噪声。

Canny边缘检测的主要步骤如下:

  1. 噪声抑制:首先,通过使用高斯滤波器对图像进行平滑处理,以去除图像中的噪声。高斯滤波器可以有效地平滑图像,同时保持边缘的细节。

  2. 计算梯度幅值和方向:使用Sobel算子计算图像中每个像素点的水平和垂直方向的梯度值。然后,根据梯度值计算每个像素点的梯度幅值和方向。

  3. 非极大值抑制:在计算得到的梯度幅值图像上进行非极大值抑制。这一步的目的是将边缘宽度变窄,使得边缘更加细化和明确。

  4. 双阈值处理:根据设定的高阈值和低阈值,将梯度幅值图像中的像素点分为强边缘、弱边缘和非边缘三类。通常选择高阈值和低阈值使得强边缘像素点的梯度幅值大于高阈值,非边缘像素点的梯度幅值小于低阈值,而弱边缘像素点的梯度幅值处于高阈值和低阈值之间。

  5. 边缘连接:最后,通过连接强边缘像素点和与之相邻的弱边缘像素点,得到完整的边缘图像。

Canny边缘检测算法通过多个阶段的处理,能够得到清晰准确的边缘信息,并且对噪声具有一定的鲁棒性。因此,它在图像处理和计算机视觉中得到广泛应用,特别是在要求高精度边缘检测的场景中。

Canny边缘检测应用场景

Canny边缘检测在图像处理和计算机视觉领域有许多应用场景,下面列举了一些常见的应用场景:

  1. 物体检测与目标定位:Canny边缘检测能够帮助检测图像中物体的边缘,从而实现目标检测和定位。在计算机视觉任务中,这对于目标识别、物体追踪和目标定位等是至关重要的。

  2. 图像分割:Canny边缘检测可以在图像中检测出物体和背景之间的边缘,有助于将图像分割成不同的区域,使得图像处理更加高效和准确。

  3. 视觉导航与SLAM:在机器人视觉导航和同时定位与地图构建(SLAM)中,Canny边缘检测有助于提取环境中的地标和边缘特征,用于机器人的定位和导航。

  4. 图像增强:Canny边缘检测可以突出图像中的边缘特征,使得图像在可视化和分析上更加清晰明了,从而用于图像增强和美化。

  5. 图像匹配与对准:Canny边缘检测能够提取图像中的特征点,用于图像匹配和图像对准,常用于图像拼接、图像融合等应用。

  6. 视觉检测与安全:Canny边缘检测在视觉检测和安全领域也有应用,例如边缘检测在视频监控中用于检测异常行为,或者在车辆驾驶辅助系统中用于车道检测和车辆识别。

  7. 医学影像处理:Canny边缘检测在医学影像处理中广泛应用,用于检测器官边缘、病变区域等,辅助医生进行疾病诊断和治疗。

总的来说,Canny边缘检测在图像处理和计算机视觉的许多领域都扮演着重要的角色,它是一种经典且有效的边缘检测算法,被广泛应用于实际场景中。

Canny 边缘检测实现步骤说明

1. 应用高斯滤波去除图像噪声

由于图像边缘非常容易受到噪声的干扰,因此为了避免检测到错误的边缘信息,通常需要对图像进行滤波以去除噪声。滤波的目的是平滑一些纹理较弱的非边缘区域,以便得到更准确的边缘。在实际处理过程中,通常采用高斯滤波去除图像中的噪声。

图 10-1 演示了使用高斯滤波器 T 对原始图像 O 中像素值为 226 的像素点进行滤波,得到该点在滤波结果图像 D 内的值的过程。

在这里插入图片描述

在滤波过程中,我们通过滤波器对像素点周围的像素计算加权平均值,获取最终滤波结果。对于高斯滤波器 T,越临近中心的点,权值越大。在图 10-1 中,对图像 O 中像素值为 226 的像素点,使用滤波器 T 进行滤波的计算过程及结果为:

结果 = 156×(197×1+25×1+106×2+156×1+159×1
 +149×1+40×3+107×4+5×3+71×1
 +163×2+198×4+226×8+223×4+156×2
 +222×1+37×3+68×4+193×3+157×1
 +42×1+72×1+250×2+41×1+75×1)
 = 138

当然,高斯滤波器(高斯核)并不是固定的,例如它还可以是:

在这里插入图片描述
滤波器的大小也是可变的,高斯核的大小对于边缘检测的效果具有很重要的作用。滤波器的核越大,边缘信息对于噪声的敏感度就越低。不过,核越大,边缘检测的定位错误也会随之增加。通常来说,一个 5×5 的核能够满足大多数的情况。

2. 计算梯度幅值和方向

前面一节讲了如何计算图像梯度的幅度。在这里,我们关注梯度的方向,梯度的方向与边缘的方向是垂直的。

边缘检测算子返回水平方向的Gx和垂直方向的Gy。梯度的幅度𝐺和方向𝛩(用角度值表示)为:

在这里插入图片描述
式中,atan2(•)表示具有两个参数的 arctan 函数。

梯度的方向总是与边缘垂直的,通常就近取值为水平(左、右)、垂直(上、下)、对角线(右上、左上、左下、右下)等 8 个不同的方向。

因此,在计算梯度时,我们会得到梯度的幅度和角度(代表梯度的方向)两个值。

图 10-2 展示了梯度的表示法。其中,每一个梯度包含幅度和角度两个不同的值。为了方便观察,这里使用了可视化表示方法。例如,左上角顶点的值“2↑”实际上表示的是一个二元数对“(2, 90)”,表示梯度的幅度为 2,角度为 90°。

在这里插入图片描述

3. 非极大值抑制

在获得了梯度的幅度和方向后,遍历图像中的像素点,去除所有非边缘的点。

在具体实现时,逐一遍历像素点,判断当前像素点是否是周围像素点中具有相同梯度方向的最大值,并根据判断结果决定是否抑制该点。

通过以上描述可知,该步骤是边缘细化的过程。针对每一个像素点:

  • 如果该点是正/负梯度方向上的局部最大值,则保留该点。
  • 如果不是,则抑制该点(归零)。

在图 10-3 中,A、B、C 三点具有相同的方向(梯度方向垂直于边缘)。判断这三个点是否为各自的局部最大值:如果是,则保留该点;否则,抑制该点(归零)。

在这里插入图片描述

经过比较判断可知,A 点具有最大的局部值,所以保留 A 点(称为边缘),其余两点(B和 C)被抑制(归零)。

在图 10-4 中,黑色背景的点都是向上方向梯度(水平边缘)的局部最大值。因此,这些点会被保留;其余点被抑制(处理为 0)。这意味着,这些黑色背景的点最终会被处理为边缘点,而其他点都被处理为非边缘点。

在这里插入图片描述

“正/负梯度方向上”是指相反方向的梯度方向。例如,在图 10-5 中,黑色背景的像素点都是垂直方向梯度(向上、向下)方向上(即水平边缘)的局部最大值。这些点最终会被处理为边缘点。

在这里插入图片描述
经过上述处理后,对于同一个方向的若干个边缘点,基本上仅保留了一个,因此实现了边缘细化的目的。

4. 应用双阈值确定边缘

完成上述步骤后,图像内的强边缘已经在当前获取的边缘图像内。但是,一些虚边缘可能也在边缘图像内。这些虚边缘可能是真实图像产生的,也可能是由于噪声所产生的。对于后者,必须将其剔除。

设置两个阈值,其中一个为高阈值 maxVal,另一个为低阈值 minVal。根据当前边缘像素的梯度值(指的是梯度幅度,下同)与这两个阈值之间的关系,判断边缘的属性。具体步骤为:

(1)如果当前边缘像素的梯度值大于或等于 maxVal,则将当前边缘像素标记为强边缘。
(2)如果当前边缘像素的梯度值介于 maxVal 与 minVal 之间,则将当前边缘像素标记为虚
边缘(需要保留)。
(3)如果当前边缘像素的梯度值小于或等于 minVal,则抑制当前边缘像素。

在上述过程中,我们得到了虚边缘,需要对其做进一步处理。一般通过判断虚边缘与强边
缘是否连接,来确定虚边缘到底属于哪种情况。通常情况下,如果一个虚边缘:

  • 与强边缘连接,则将该边缘处理为边缘。
  • 与强边缘无连接,则该边缘为弱边缘,将其抑制。

在图 10-6 中,左图显示的是三个边缘信息,右图是对边缘信息进行分类的示意图,具体划分如下:

  • A 点的梯度值值大于 maxVal,因此 A 是强边缘。
  • B 和 C 点的梯度值介于 maxVal 和 minVal 之间,因此 B、C 是虚边缘。
  • D 点的梯度值小于 minVal,因此 D 被抑制(抛弃)。

在这里插入图片描述
图 10-7 显示了对图 10-6 中的虚边缘 B 和 C 的处理结果。其中:

  • B 点的梯度值介于 maxVal 和 minVal 之间,是虚边缘,但该点与强边缘不相连,故将其抛弃。
  • C 点的梯度值介于 maxVal 和 minVal 之间,是虚边缘,但该点与强边缘 A 相连,故将其保留。

在这里插入图片描述
注意,高阈值 maxVal 和低阈值 minVal 不是固定的,需要针对不同的图像进行定义。

10-8 给出了一个 Canny 边缘检测的效果图。

在这里插入图片描述

5.检测边缘连接

Canny边缘检测的边缘连接是指将非极大值抑制得到的边缘点连接成连续的边缘线。这个过程是Canny边缘检测算法中的最后一步,它的目的是去除由于非极大值抑制产生的间断的边缘点,从而得到更加准确和连续的边缘检测结果。

下面详细讲解Canny边缘检测的边缘连接过程:

  1. 遍历梯度幅值图像:首先,遍历经过非极大值抑制后的梯度幅值图像,即只有边缘上的像素点的梯度幅值被保留,其他像素点的梯度幅值为零。

  2. 标记边缘点:对于每个强边缘像素点(梯度幅值大于高阈值),将其标记为边缘点。强边缘像素点是图像中梯度值较大的像素点,它们代表了图像中明显的边缘。

  3. 边缘连接:对于每个边缘点的相邻像素点,如果其梯度幅值大于低阈值,并且没有被标记为边缘点,则将其标记为弱边缘点,并递归地进行边缘连接。这一步的目的是将与强边缘像素点相邻的弱边缘像素点连接到边缘线上。

  4. 递归连接:在边缘连接过程中,如果某个弱边缘像素点被标记为边缘点,则会继续检查该像素点的相邻像素点,以便将所有与强边缘像素点相邻的弱边缘像素点连接到边缘线上。

  5. 结束条件:边缘连接的递归过程会一直进行,直到所有与强边缘像素点相邻的弱边缘像素点都被标记为边缘点,没有更多的像素点可以连接。

  6. 非边缘点处理:经过边缘连接后,所有未被标记为边缘点的像素点视为非边缘点,并抑制其梯度幅值为零,从而得到最终的边缘图像。

Canny 函数说明及示例

OpenCV 提供了函数 cv2.Canny()来实现 Canny 边缘检测,其语法形式如下:

edges = cv.Canny( image, threshold1, threshold2[, apertureSize[, L2gradient]])

式中:

  • edges 为计算得到的边缘图像。
  • image 为 8 位输入图像。
  • threshold1 表示处理过程中的第一个阈值。
  • threshold2 表示处理过程中的第二个阈值。
  • apertureSize 表示 Sobel 算子的孔径大小。
  • L2gradient 为计算图像梯度幅度(gradient magnitude)的标识。其默认值为 False。如果为 True,则使用更精确的 L2 范数进行计算(即两个方向的导数的平方和再开方),否则使用 L1 范数(直接将两个方向导数的绝对值相加)。

在这里插入图片描述

代码示例:使用函数 cv2.Canny()获取图像的边缘

原图:
请添加图片描述

代码如下:

import cv2
#读取图像,灰度模式
o=cv2.imread("feibu.png",cv2.IMREAD_GRAYSCALE)
#边缘检测,canny算子,阈值128-200,低于128的像素点认为是边缘,高于200的像素点认为是边缘,中间值的像素点如果与边缘点相连则认为是边缘
r1=cv2.Canny(o,128,200)

cv2.imshow("original",o)
cv2.imshow("result1",r1)

cv2.waitKey()
cv2.destroyAllWindows()


运行效果:

在这里插入图片描述
针对不同的图片阈值的范围需要不断的调式有最佳的效果。

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

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

相关文章

APP外包开发的学习流程

学习iOS App的开发是一项有趣和富有挑战性的任务,是一个不断学习和不断进步的过程。掌握基础知识后,不断实践和尝试新的项目将使您的技能不断提升。下面和大家分享一些建议,可以帮助您开始学习iOS App的开发。北京木奇移动技术有限公司&#…

Redis 拒绝服务漏洞(CVE-2023-28856)修复处理

一、漏洞描述 Redis Labs Redis是美国Redis Labs公司的一套开源的使用ANSI C编写、支持网络、可基于内存亦可持久化的日志型、键值(Key-Value)存储数据库,并提供多种语言的API。 Redis 7.0.0 到 7.0.10版本、6.2.0 到 6.2.11版本、6.0.0 到 …

【Linux】【预】配置网络IP,挂载网络目录

【Linux】【预】配置网络IP,挂载网络目录 1. 配置查看IP2.配置Linux中的IP3. 串口连接开发板,配置 1. 配置查看IP a . 查看ipifconfig如下操作,其中的:192.168.252.140就是它的IP b . 使用xmodem 连接到虚拟机,最后点…

P1396 营救(最小生成树)(内附封面)

营救 题目背景 “咚咚咚……”“查水表!”原来是查水表来了,现在哪里找这么热心上门的查表员啊!小明感动得热泪盈眶,开起了门…… 题目描述 妈妈下班回家,街坊邻居说小明被一群陌生人强行押上了警车!妈…

2. Linux安装Git

yum安装 查看版本 版本太低,所以我们采用自己上传编译的方式进行 删除已安装的git yum remove git 下载最新安装包,并上传到服务器文件夹下 上传,解压 5.安装编译需要的依赖 yum install curl-devel expat-devel gettext-devel openssl-…

【Leetcode】无重复字符的最长字串||带输出测试(滑动窗口+HashMap)

step by step. 题目 给定一个字符串 s ,请你找出其中不含有重复字符的 最长子串 的长度。 示例 1: 输入: s "abcabcbb" 输出: 3 解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。示例 2: 输入: s "bbbbb" 输出…

UE4 Cesium for unreal 离线加载应用全流程

参考配置:Win10、请保证是在局域网环境下配置 配置IP 右键选择:打开“网络和Internet” 设置 选择更改适配器选项 请保证以太网是处于启用状态并连接线缆,点击右键选择属性 双击选择Internet协议版本4(TCP/IPv4) 将IP地…

Git从远程仓库中删除文件,并上传新文件

目录 删除: 拉取远程分支的更新: ​编辑 首先查看git状态: ​编辑 删除文件并提交版本库: 提交: 上传新文件: 首先查看git状态: 提交到暂存区: 提交到版本库: 上…

028 - having函数

-- SQL Server中的聚合函数有:聚合数据(group by)后面不能跟过滤条件where 1.count() 所有记录du数 2.count(*)所有非null记录数 3.avg() 某一列平均值 4.min() 某一列最小值 5.max() 某一列最大值 6.sum() 某一列总和 -- 聚合数据&#xf…

人大金仓数据库Docker部署

docker 搭建 yum -y install yum-utilsyum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.reposystemctl start docker.servicesystemctl enable docker.servicesystemctl status docker.service 配置Docker cd /etc/docker/ vi da…

如何安全变更亚马逊收款账户?

有太多的卖家想知道如何安全变更亚马逊收款账户,因为更改了第三方收款账户可能会导致二次视频认证或者增强视频。真的是这样吗? 其实不推荐亚马逊店铺正常运营之后去变更信用卡,收款账户等重要资料的,因为玩黑科技的卖家也真的多…

嵌入式开发学习(STC51-18-LCD液晶显示)

内容 在LCD1602液晶上显示字符信息; LCD1602介绍 简介 1602液晶也叫1602字符型液晶,它能显示2行字符信息,每行又能显示16个字符; 它是一种专门用来显示字母、数字、符号的点阵型液晶模块; 它是由若干个5x7或者5x…

PEMFC氢氧质子交换燃料电池MATLAB仿真模型

氢氧燃料电池静态模型: (1)热力学电动势En (2)活化极化过电势Vact 活化损失主要是因为电极表面的反应速度过慢,在驱动电子传递到或者传送出电极的化学反应时,部分电压会被消耗。 (…

机器学习——SMO算法推导与实践

一、 硬间隔-SMO算法推导 明天再说,啊。。。。感觉天空明朗了很多,即使现在已经很晚了 还是要打开柯南,看看电视,等待天气预报所说的台风天吧! 一时之间,忽然失去了用markdown语法写下推导过程的勇气。。。…

干货:电视盒子什么牌子好?数码博主盘点电视盒子排名

电视盒子是我们观影不可缺少的装备之一,但面对众多的电视盒子产品,大家在选购时会疑惑电视盒子什么牌子好,我作为数码测评博主,本期要分享的主题是电视盒子,通过对比今年测评过的26款热门电视盒子,我整理了…

Tkinter的超强主题扩展-ttkbootstrap

1、前言 在上一篇文章 将Python脚本集成到GUI工具包-Tkinter 里,作者介绍了 Tkinter,并开发了测试参数组合生成器小工具,虽然功能上已经满足了所要的需求,但是页面展示方面很不美观,需要改进一下。 本篇将介绍一款 T…

使用罗技鼠标后 弹出当前页面的脚本发生错误AppData/Local/Temp/LogiUI/Pak/js/jquery-1.3.2.min.js解决

使用的台式机,没有蓝牙驱动,在用logi无线鼠标时,把鼠标连接插入台式机后弹出的如上图所示这个提示,无论是点是/否,还是X掉上图提示,电脑右下角的图依然存在。不习惯这丫的存在。 我重启还是有,然…

1. Git基础知识

文章目录 Git基础知识一、集中式与分布式二、中心服务器三、工作流四、分支实现五、冲突六、Fast forward七、储藏(Stashing)八、SSH 传输设置九、.gitignore 文件十、Git 命令一览十一、和远端仓库交互 Git基础知识 一、集中式与分布式 Git 属于分布式…

服务蓝图:提升和改善服务系统的工具

服务蓝图:提升和改善服务系统的工具 Service Blueprint 翻译成服务提供计划比较恰当 趣讲大白话:精细耕耘,才有好体验 【趣讲信息科技249期】 **************************** 西方擅长的是工具和方法 把一件事情透过工具和方法做到人人能懂 日…

Day 74:通用BP神经网络 (1. 集中管理激活函数)

代码: package dl;/*** Activator.*/public class Activator {/*** Arc tan.*/public final char ARC_TAN a;/*** Elu.*/public final char ELU e;/*** Gelu.*/public final char GELU g;/*** Hard logistic.*/public final char HARD_LOGISTIC h;/*** Identit…