OpenCV——Canny边缘检测(cv2.Canny())

OpenCV——Canny边缘检测(cv2.Canny())Canny边缘检测Canny边缘检测是一种使用多级边缘检测算法检测边缘的方法。1986年,JohnF.Canny发表了著名的论文AComputationalApproachtoEdgeDetection,在该论文中详述了如何进行边缘检测。Canny()边缘检测步骤Canny边缘检测分为如下几个步骤:步骤1:去噪。噪声会影响边缘检测的准确性,因此首先要将噪声过滤掉。步骤2:计算梯度的幅度与方向。步骤3:非极大值抑制,即适当地让边缘“变瘦”。步骤4:确定边缘。使

大家好,又见面了,我是你们的朋友全栈君。

Canny边缘检测

Canny 边缘检测是一种使用多级边缘检测算法检测边缘的方法。1986 年,John F. Canny 发
表了著名的论文 A Computational Approach to Edge Detection,在该论文中详述了如何进行边缘
检测。

Canny()边缘检测步骤

Canny 边缘检测分为如下几个步骤:
步骤 1:去噪。噪声会影响边缘检测的准确性,因此首先要将噪声过滤掉。
步骤 2:计算梯度的幅度与方向。
步骤 3:非极大值抑制,即适当地让边缘“变瘦”。
步骤 4:确定边缘。使用双阈值算法确定最终的边缘信息。
下面对上述步骤分别进行简单的介绍。

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

由于图像边缘非常容易受到噪声的干扰,因此为了避免检测到错误的边缘信息,通常需要对图像进行滤波以去除噪声。滤波的目的是平滑一些纹理较弱的非边缘区域,以便得到更准确的边缘。在实际处理过程中,通常采用高斯滤波去除图像中的噪声。
在滤波过程中,我们通过滤波器对像素点周围的像素计算加权平均值,获取最终滤波结果。滤波器的大小也是可变的,高斯核的大小对于边缘检测的效果具有很重要的作用。滤波器
的核越大,边缘信息对于噪声的敏感度就越低。不过,核越大,边缘检测的定位错误也会随之增加。通常来说,一个 5×5 的核能够满足大多数的情况。

2. 计算梯度

梯度的方向与边缘的方向是垂直的。
边缘检测算子返回水平方向的Gx和垂直方向的Gy。梯度的幅度?和方向?(用角度值表示)为:
在这里插入图片描述
式中,atan2(•)表示具有两个参数的 arctan 函数。
梯度的方向总是与边缘垂直的,通常就近取值为水平(左、右)、垂直(上、下)、对角线(右上、左上、左下、右下)等 8 个不同的方向。
因此,在计算梯度时,我们会得到梯度的幅度和角度(代表梯度的方向)两个值。
图 10-2 展示了梯度的表示法。其中,每一个梯度包含幅度和角度两个不同的值。为了方便观察,这里使用了可视化表示方法。例如,左上角顶点的值“2↑”实际上表示的是一个二元数对“(2, 90)”,表示梯度的幅度为 2,角度为 90°。
在这里插入图片描述

3. 非极大值抑制

在获得了梯度的幅度和方向后,遍历图像中的像素点,去除所有非边缘的点。在具体实现时,逐一遍历像素点,判断当前像素点是否是周围像素点中具有相同梯度方向的最大值,并根据判断结果决定是否抑制该点。通过以上描述可知,该步骤是边缘细化的过程。针对每一个像
素点:
 如果该点是正/负梯度方向上的局部最大值,则保留该点。
 如果不是,则抑制该点(归零)

4. 应用双阈值确定边缘

完成上述步骤后,图像内的强边缘已经在当前获取的边缘图像内。但是,一些虚边缘可能也在边缘图像内。这些虚边缘可能是真实图像产生的,也可能是由于噪声所产生的。对于后者,必须将其剔除。
设置两个阈值,其中一个为高阈值 maxVal,另一个为低阈值 minVal。根据当前边缘像素的梯度值(指的是梯度幅度,下同)与这两个阈值之间的关系,判断边缘的属性。具体步骤为:
(1)如果当前边缘像素的梯度值大于或等于 maxVal,则将当前边缘像素标记为强边缘。
(2)如果当前边缘像素的梯度值介于 maxVal 与 minVal 之间,则将当前边缘像素标记为虚
边缘(需要保留)。
(3)如果当前边缘像素的梯度值小于或等于 minVal,则抑制当前边缘像素。
在上述过程中,我们得到了虚边缘,需要对其做进一步处理。一般通过判断虚边缘与强边缘是否连接,来确定虚边缘到底属于哪种情况。通常情况下,如果一个虚边缘:
 与强边缘连接,则将该边缘处理为边缘。
 与强边缘无连接,则该边缘为弱边缘,将其抑制。

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()获取图像的边缘,并尝试使用不同大小的 threshold1 和threshold2。

import cv2
o=cv2.imread("lena.bmp",cv2.IMREAD_GRAYSCALE)
r1=cv2.Canny(o,128,200)
r2=cv2.Canny(o,32,128)
cv2.imshow("original",o)
cv2.imshow("result1",r1)
cv2.imshow("result2",r2)
cv2.waitKey()
cv2.destroyAllWindows()

运行结果:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
从程序运行结果可知,当函数 cv2.Canny()的参数 threshold1 和 threshold2 的值较小时,能够捕获更多的边缘信息。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/141638.html原文链接:https://javaforall.net

赞 (0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 511遇见易语言教程外形框和模仿进度条闪烁效果「建议收藏」

    511遇见易语言教程外形框和模仿进度条闪烁效果「建议收藏」本节课录制了易语言的外形框,录了外形看的填充颜色、线条颜色、现行选中项,线型、线条效果,线宽、外形、并且实现了通过外形框来实现仿制进度条,及闪烁效果。视频链接:73外形框和模仿进度条闪烁效果源码:.版本2.子程序__启动窗口_创建完毕时钟1.时钟周期=10.子程序_时钟1_周期事件置随机数种子().如果真(外形框3.宽度≤400)外形框3.宽度=外形框3.宽度+取随机数(1,10).如果真结束.版本2.子程序__启

    2022年7月13日
  • Mina框架的使用[通俗易懂]

    什么是Mina框架ApacheMina是一个能够帮助用户开发高性能和高伸缩性网络应用程序的框架。它通过Javanio技术基于TCP/IP和UDP/IP协议提供了抽象的、事件驱动的、异步的API。是用来代替NIO网络框架的,对NIO框架进行了一层封装的Socket库。Mina主页下载地址为什么使用Mina?传统socket:阻塞式通信每建立一个Socket连接时,同时创建一个新线程对该Soc

    2022年4月17日
  • 儿童计算机编程课是学什么(大学计算机课程)

    当今世界已经处于数字、网络和信息的计算机时代,而计算机编程是时代发展的关键因素,学习计算机学科的编程能培养一个人的创造力,使学习者具有批判性思维技能,同时使其成为主动学习者,为此,在少儿阶段接触和学习计算机编程知识,能使我们在今后的学习和生活中,更好的理解我们所处的时代,有能力改造我们的时代,并因此而终生受益。我们专门针对少儿学习者,开设了六门计算机科学基础课程,以方便少儿计算机编程学习者能灵活、…

    2022年4月17日
  • mac navicat 激活码【永久激活】

    (mac navicat 激活码)2021最新分享一个能用的的激活码出来,希望能帮到需要激活的朋友。目前这个是能用的,但是用的人多了之后也会失效,会不定时更新的,大家持续关注此网站~IntelliJ2021最新激活注册码,破解教程可免费永久激活,亲测有效,下面是详细链接哦~https://javaforall.net/100143.html…

    2022年3月21日
  • onpropertychange属性

          当一个input标签的value通过键盘改变后失去焦点的时候,我们可以用onchange捕获事件,IE和FireFox都有效。而通过JavaScript来改变value的时候,onchange无法捕获事件,这时候我们可以用onpropertychange来捕获onpropertychange对于JavaScript和键盘对value的改变都有效。遗憾的是,onpropertychange事件只在IE中有效,FireFox中无效。尽FireFox的oninput可以来弥补(不必失去焦点),但是也仅

    2022年4月6日
  • 安装phpMyAdmin图文教程-学习(转载)

    安装phpMyAdmin图文教程-学习(转载)phpmyadmin的安装配置已经是老生常谈的话题了,网络上到处都可以找到相关的配置教程。但是,那些大多都是手动配置的,稍不留神,容易出错。因此站长今天在这里介绍的是,被很多phpmyadmin用户所忽略的phpmyadmin自带的安装程序,下面我们就开始一步一步来安装phpmyadmin。1、…

    2022年5月6日

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号