Canny边缘检测

这篇具有很好参考价值的文章主要介绍了Canny边缘检测。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1.算法概述

  图象的边缘是指图象局部区域亮度变化显著的部分,该区域的灰度剖面可以看作是一个阶跃,即从一个灰度值在很小的缓冲区域内急剧变化到另一个灰度相差较大的灰度值。图象的边缘部分集中了图象的大部分信息,图象边缘的确定与提取对于整个图象场景的识别与理解是非常重要的,同时也是图象分割所依赖的重要特征,边缘检测主要是图象的灰度变化的度量、检测和定位

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

 通常情况下边缘检测的目的是在保留原有图像属性的情况下,显著减少图像的数据规模。有多种算法可以进行边缘检测,虽然Canny算法年代久远,但可以说它是边缘检测的一种标准算法,而且仍在研究中广泛使用。

2.最优边缘准则

 Canny 的目标是找到一个最优的边缘检测算法,最优边缘检测的含义是:

(1)最优检测:算法能够尽可能多地标识出图像中的实际边缘,漏检真实边缘的概率和误检非边缘的概率都尽可能小;
(2)最优定位准则:检测到的边缘点的位置距离实际边缘点的位置最近,或者是由于噪声影响引起检测出的边缘偏离物体的真实边缘的程度最小;
(3)检测点与边缘点一一对应:算子检测的边缘点与实际边缘点应该是一一对应。 为了满足这些要求,Canny 使用了变分法(calculus of variations),这是一种寻找优化特定功能的函数的方法。最优检测使用四个指数函数项表示,但是它非常近似于高斯函数的一阶导数。

3.Canny 边缘检测基础

Canny 边缘检测分为如下几个步骤:

(1)应用高斯滤波平滑图像,目的是去除噪声。
(2)计算图像梯度,得到可能边缘;
(3)应用非最大抑制技术来消除边误检;
(4)应用双阈值的方法筛选边缘信息;
(5)利用滞后技术来跟踪边界。

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

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

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

 在滤波过程中,通过滤波器对像素点周围的像素计算加权平均值,获取最终滤波结果。对于高斯滤波器T,越临近中心的点,权值越大

 对图像O中像素值为226的像素点,使用滤波器T进行滤波的计算过程及其结果为:结果=1/56×
(197×1+25×1+106×2+156×1+159×1
+149×1+40×1+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的核能够满足大多数的情况。

3.2 计算梯度

 在这里,我们只需要关注梯度的方向,梯度的方向与边缘的方向是垂直的。边缘检测算子返回水平方向的Gx和垂直方向的Gy。梯度的幅度𝐺和方向𝛩(用角度值表示)为:
Canny边缘检测
 其中,atan2(•)表示具有两个参数的arctan函数。梯度的方向总是与边缘垂直的,通常就近取值为水平(左、右)、垂直(上、下)、对角线(右上、左上、左下、右下)等 8 个不同的方向。

 因此,在计算梯度时,会得到梯度的幅度和角度(代表梯度的方向)两个值。图3-2展示了梯度的表示法。其中,每一个梯度包含幅度和角度两个不同的值。为了方便观察,这里使用了可视化表示方法。例如,左上角顶点的值“2↑”实际上表示的是一个二元数对“(2, 90)”,表示梯度的幅度为 2,角度为 90°。
Canny边缘检测
图3-2  梯度示例

3.3 非极大值抑制

 在获得了梯度的幅度和方向后,遍历图像中的像素点,去除所有非边缘的点。在具体实现时,逐一遍历像素点,判断当前像素点是否是周围像素点中具有相同梯度方向的最大值,并根据判断结果决定是否抑制该点
 通过以上描述可知,该步骤是边缘细化的过程。针对每一个像素点:
 (1)如果该点是正/负梯度方向上的局部最大值,则保留该点。
 (2)如果不是,则抑制该点(归零)。如图3-3中,A、B、C三点具有相同的方向(梯度方向垂直于边缘)。判断这三个点是否为各自的局部最大值:如果是,则保留该点;否则,抑制该点(归零)。
Canny边缘检测
图3-3  非极大值抑制示例之一

 通过比较判断可知,A点具有最大的局部值,所以保留A点(称为边缘),其余两点(B和C)被抑制(归零)。
 在图3-4中,黑色背景的点都是向上方向梯度(水平边缘)的局部最大值。因此,这些点会被保留;其余点被抑制(处理为 0)。这意味着,这些黑色背景的点最终会被处理为边缘点,而其他点都被处理为非边缘点
Canny边缘检测
图3-4  非极大值抑制示例之二

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

 经过以上处理后,对于同一个方向的若干个边缘点,基本上仅保留了一个,因此实现了边缘细化的目的。

3.4 应用双阈值确定边缘

 在完成非极大值抑制之后,图像的强边缘已经在当前获取的边缘图像内。但是,一些虚边缘可能也在边缘图像内。这些虚边缘可能是真实图像产生的,也可能是由于噪声产生的。对于由于噪声产生的虚边缘必须将其剔除

 因此设置两个阀值,分别为高阀值(maxVal)和低阀值(minVal)。根据当前边缘像素的梯度幅度与这两个阀值之间的关系,判断边缘的属性,具体步骤如下:
   ①如果当前边缘像素的梯度幅度大于或等于高阀值,则将当前边缘像素标记为强边缘(需要保留)。
  ②如果当前边缘像素的梯度幅度介于高阀值与低阀值之间,则将当前边缘像素标记为虚边缘(需要保留)。
  ③如果当前边缘像素的梯度幅度小于或等于低阀值,则抑制当前边缘像素(需要抛弃)。

 在上述过程中我们得到了虚边缘,需要对其做进一步处理。一般通过判断虚边缘和强边缘是否连接来确定虚边缘到底属于哪种情况。通常情况下,对于一个虚边缘:
  ①与强边缘连接,则将该边缘处理为边缘。
  ②与强边缘无连接,则该边缘为弱边缘,将其抑制。

 如图3-5,左侧显示的是三个边缘信息,右侧是对边缘信息进行分类的示意图,具体划分如下:
  ①A点的梯度值值大于maxVal,因此A是强边缘
  ②B和C点的梯度值介于maxVal和minVal之间,因此B、C是虚边缘
  ③D 点的梯度值小于minVal,因此D被抑制(抛弃)。
Canny边缘检测
图3-5  边缘分类的示意图

 图3-6显示了对图3-5中的虚边缘B和C的处理结果,其中
  ①B点的梯度值介于maxVal和minVal之间,是虚边缘,但该点与强边缘不相连,故将其抛弃
  ②C点的梯度值介于maxVal和minVal之间,是虚边缘,但该点与强边缘A相连,故将其保留
Canny边缘检测
图3-6   边缘分类的处理结果示意图

 需要注意的是,高阀值和低阀值不是固定的,需要针对不同的图像进行定义。

4.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 范数(直接将两个方向导数的绝对值相加)。
Canny边缘检测
程序示例
使用函数cv2.Canny()获取图像的边缘,并尝试使用不同大小的 threshold1和threshold2观察获取到的边缘有何不同。

import cv2
original = cv2.imread("lena_gray.jpg")
result_1 = cv2.Canny(original, 64, 256)
result_2 = cv2.Canny(original, 16, 128)
result_3 = cv2.Canny(original, 8, 64)
cv2.imshow("lena_gray", original)
cv2.imshow("threshold1=64,threshold2=256时的边缘检测结果", result_1)
cv2.imshow("threshold1=16,threshold2=128时的边缘检测结果", result_2)
cv2.imshow("threshold1=8,threshold2=64时的边缘检测结果", result_3)
cv2.waitKey()
cv2.destroyAllWindows()

 程序运行结果如图4-1、4-2、4-3和4-4所示,对比可以知道,当函数cv2.Canny()的参数threshold1和threshold2的值较小时,能够捕获更多的边缘信息
Canny边缘检测

图4-1  原始图像

Canny边缘检测
图4-2  threshold1=64,threshold2=256时的边缘检测结果
Canny边缘检测
图4-3  threshold1=16,threshold2=128时的边缘检测结果
Canny边缘检测
图4-4  threshold1=8,threshold2=64时的边缘检测结果
文章来源地址https://www.toymoban.com/news/detail-461873.html

到了这里,关于Canny边缘检测的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Canny边缘检测

      图象的边缘是指 图象局部区域亮度变化显著的部分 ,该区域的灰度剖面可以看作是一个阶跃,即从一个灰度值在很小的缓冲区域内急剧变化到另一个灰度相差较大的灰度值。 图象的边缘部分集中了图象的大部分信息 ,图象边缘的确定与提取对于整个图象场景的识别与理

    2024年02月06日
    浏览(38)
  • Canny边缘检测算法

    Canny是目前最优秀的边缘检测算法之一,在传统机器学习算法当中,Canny是最优秀的算法,但是有深度学习的方法要比Canny好。Canny算法的目标是找到一个最优的边缘,其最优边缘的定义为: 好的检测:算法能够尽可能的标出图像中的实际边缘 好的定位:标识出的边缘要与实际

    2024年02月09日
    浏览(47)
  • OpenCV——Canny边缘检测算法

    图像分割是将数字图像细分为多个子区域的过程,在计算机视觉/机器视觉领域被广泛应用。它的目的是简化或改变图像的表示形式,以便更容易理解和分析。常见的图像分割方法包括阈值处理、聚类法、边缘检测和区域生长等。解决图像分割问题通常需要结合领域知识,以提

    2024年04月17日
    浏览(44)
  • opencv-Canny 边缘检测

    Canny边缘检测是一种经典的图像边缘检测算法,它在图像中找到强度梯度的变化,从而 识别出图像中的边缘 。 Canny边缘检测的优点包括高灵敏度和低误检率。 在OpenCV中, cv2.Canny() 函数用于执行Canny边缘检测。 基本语法如下: 参数说明: image : 输入图像,通常为灰度图像。

    2024年02月22日
    浏览(58)
  • 【OpenCV】第十章: Canny边缘检测

    第十章: Canny边缘检测 canny边缘检测是一种一阶微分算子检测算法,但为什么还要单独拿出来讲呢,因为它几乎是边缘检测算子中最优秀的边缘检测算子,你很难找到一种边缘检测算子能显著地比Canny算子做的更好。 Canny提出了边缘检测算子优劣评判的三条标准: 1、较高的检

    2024年02月03日
    浏览(40)
  • opencv(七)Canny边缘检测和图像轮廓检测

    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 1、检测步骤 1)使用高斯滤波器,以平滑图像,滤掉噪声。 2)计算图像中每个像素点的梯度强度和方向 3)应用非极大值(Non-Maximum Suppression)抑制,以消除边缘检测带来的杂散响应 4)应用双阈值(

    2024年02月04日
    浏览(53)
  • Python Opencv实践 - Canny边缘检测

     

    2024年02月11日
    浏览(48)
  • 【OpenCV实现图像梯度,Canny边缘检测】

    OpenCV中,可以使用各种函数实现图像梯度和Canny边缘检测,这些操作对于图像处理和分析非常重要。 图像梯度通常用于寻找图像中的边缘和轮廓。在OpenCV中,可以使用cv2.Sobel()函数计算图像的梯度,该函数可以计算图像在水平和垂直方向上的梯度。梯度的方向和大小可以帮助

    2024年02月07日
    浏览(48)
  • python实现Canny算子边缘检测算法

        边缘检测是一种将图片中关键信息表现出来的一种图片技术,它的结果并不是字面意思上的获取图片边缘,而是将图片有用的信息勾勒出来,类似素描的结果,但是已经去掉了很多信息。如下所示,一张原始的图片是这样的:          通过边缘检测算法,我们最终得到

    2024年02月08日
    浏览(40)
  • 图像边缘检测--(Sobel、Laplacian、Canny)

    1、图像中各种形状的检测是计算机视觉领域中非常常见的技术之一,特别是图像中直线的检测,圆的检测,图像边缘的检测等,下面将介绍如何快速检测图像边缘。 2、边缘是不同区域的分界线,是周围(局部)像素有显著变化的像素的集合,有幅值与方向两个属性。这个不

    2024年02月07日
    浏览(48)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包