OpenCV竟然可以这样学!成神之路终将不远(十五)

简介: OpenCV竟然可以这样学!成神之路终将不远(十五)

 返回目录

目录

15 Canny边缘检测

15.1 目标

15.2 理论

15.2.1 查找图像的强度梯度

15.2.2 磁滞阈值

15.3 OpenCV中的Canny Edge检测

15.4 附加资源

15.5 练习


15 Canny边缘检测

15.1 目标

在本章中,我们将学习 - Canny边缘检测的概念 - OpenCV函数: cv.Canny()

15.2 理论

Canny Edge Detection是一种流行的边缘检测算法。它由John F. Canny发明

    1. 这是一个多阶段算法,我们将经历每个阶段。
    2. 降噪

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

    15.2.1 查找图像的强度梯度

    然后使用Sobel核在水平和垂直方向上对平滑的图像进行滤波,以在水平方向(Gx)和垂直方向(Gy)上获得一阶导数。从这两张图片中,我们可以找到每个像素的边缘渐变和方向,如下所示:

    渐变方向始终垂直于边缘。将其舍入为代表垂直,水平和两个对角线方向的四个角度之一。

    非极大值抑制:在获得梯度大小和方向后,将对图像进行全面扫描,以去除可能不构成边缘的所有不需要的像素。为此,在每个像素处,检查像素是否是其在梯度方向上附近的局部最大值。查看下面的图片:

    image.gif编辑

    点A在边缘(垂直方向)上。渐变方向垂直于边缘。点B和C在梯度方向上。因此,将A点与B点和C点进行检查,看是否形成局部最大值。如果是这样,则考虑将其用于下一阶段,否则将其抑制(置为零)。 简而言之,你得到的结果是带有“细边”的二进制图像。

    15.2.2 磁滞阈值

    该阶段确定哪些边缘全部是真正的边缘,哪些不是。为此,我们需要两个阈值minValmaxVal。强度梯度大于maxVal 的任何边缘必定是边缘,而小于minVal的那些边缘必定是非边缘,因此将其丢弃。介于这两个阈值之间的对象根据其连通性被分类为边缘或非边缘。如果将它们连接到“边缘”像素,则将它们视为边缘的一部分。否则,它们也将被丢弃。见下图:

    image.gif编辑

    边缘A在maxVal 之上,因此被视为“确定边缘”。尽管边C低于maxVal,但它连接到边A,因此也被视为有效边,我们得到了完整的曲线。但是边缘B尽管在minVal之上并且与边缘C处于同一区域,但是它没有连接到任何“确保边缘”,因此被丢弃。因此,非常重要的一点是我们必须相应地选择minValmaxVal 以获得正确的结果。

    注意:在边缘为长线的假设下,该阶段还消除了小像素噪声。因此,我们最终得到的是图像中的强边缘。

    15.3 OpenCV中的Canny Edge检测

    OpenCV将以上所有内容放在单个函数cv.Canny()中。我们将看到如何使用它。

    第一个参数是我们的输入图像。

    第二个和第三个参数分别是我们的minValmaxVal

    第三个参数是perture_size 。它是用于查找图像渐变的Sobel内核的大小。默认情况下为3。

    最后一个参数是L2gradient,它指定用于查找梯度幅度的方程式。如果为True ,则使用上面提到的更精确的公式,否则使用以下函数:

    默认情况下,它为False 。

    代码如下:

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

    image.gif

    运行结果如下:

    image.gif编辑

    15.4 附加资源

      1. Canny edge detector at Wikipedia
      2. Canny Edge Detection Tutorial:by Bill Green, 2002.

      15.5 练习

      编写一个小应用程序以找到Canny边缘检测,该检测的阈值可以使用两个跟踪栏进行更改。这样,你可以了解阈值的影响。

      代码如下:

      import cv2 as cv
      def nothing(x):
          pass
      img = cv.imread('01.jpg', 0)
      # 创建一个窗口以供使用
      cv.namedWindow('Edges', cv.WINDOW_NORMAL)
      # 创建阈值变化的轨迹栏
      cv.createTrackbar('minValue', 'Edges', 0, 255, nothing)
      cv.createTrackbar('maxValue', 'Edges', 0, 255, nothing)
      while True:
          if cv.waitKey(1) & 0xFF == 27:
              break
          # 得到两条轨迹的当前位置
          min_value = cv.getTrackbarPos('minValue', 'Edges')
          max_value = cv.getTrackbarPos('maxValue', 'Edges')
          edges = cv.Canny(img, min_value, max_value)
          cv.imshow('Edges', edges)
      cv.destroyAllWindows()

      image.gif

      运行结果如下:

      image.gif编辑


      欢迎评论区留言,一起探讨OpenCV成神之路的奥秘。

      顺便给我加个关注,点个赞,加个收藏,让我们一起登上神坛。

      image.gif编辑

      相关文章
      |
      4月前
      |
      计算机视觉
      Opencv学习笔记(三):图像二值化函数cv2.threshold函数详解
      这篇文章详细介绍了OpenCV库中的图像二值化函数`cv2.threshold`,包括二值化的概念、常见的阈值类型、函数的参数说明以及通过代码实例展示了如何应用该函数进行图像二值化处理,并展示了运行结果。
      936 0
      Opencv学习笔记(三):图像二值化函数cv2.threshold函数详解
      |
      5月前
      |
      存储 计算机视觉
      Opencv的基本操作(一)图像的读取显示存储及几何图形的绘制
      本文介绍了使用OpenCV进行图像读取、显示和存储的基本操作,以及如何绘制直线、圆形、矩形和文本等几何图形的方法。
      Opencv的基本操作(一)图像的读取显示存储及几何图形的绘制
      |
      5月前
      |
      算法 计算机视觉
      opencv图像形态学
      图像形态学是一种基于数学形态学的图像处理技术,它主要用于分析和修改图像的形状和结构。
      76 4
      WK
      |
      6月前
      |
      编解码 计算机视觉 Python
      如何在OpenCV中进行图像转换
      在OpenCV中,图像转换涉及颜色空间变换、大小调整及类型转换等操作。常用函数如`cvtColor`可实现BGR到RGB、灰度图或HSV的转换;`resize`则用于调整图像分辨率。此外,通过`astype`或`convertScaleAbs`可改变图像数据类型。对于复杂的几何变换,如仿射或透视变换,则可利用`warpAffine`和`warpPerspective`函数实现。这些技术为图像处理提供了强大的工具。
      WK
      182 1
      |
      6月前
      |
      算法 计算机视觉 Python
      python利用opencv进行相机标定获取参数,并根据畸变参数修正图像附有全部代码(流畅无痛版)
      该文章详细介绍了使用Python和OpenCV进行相机标定以获取畸变参数,并提供了修正图像畸变的全部代码,包括生成棋盘图、拍摄标定图像、标定过程和畸变矫正等步骤。
      python利用opencv进行相机标定获取参数,并根据畸变参数修正图像附有全部代码(流畅无痛版)
      |
      7月前
      |
      机器学习/深度学习 XML 计算机视觉
      OpenCV(Open Source Computer Vision Library)是一个开源的计算机视觉和机器学习库,它提供了大量的函数和工具,用于处理图像和视频数据。
      OpenCV(Open Source Computer Vision Library)是一个开源的计算机视觉和机器学习库,它提供了大量的函数和工具,用于处理图像和视频数据。
      |
      8月前
      |
      算法 计算机视觉
      【Qt&OpenCV 图像的感兴趣区域ROI】
      【Qt&OpenCV 图像的感兴趣区域ROI】
      284 1
      |
      8月前
      |
      运维 算法 计算机视觉
      【Qt&OpenCV 图像的模板匹配 matchTemplate/minMaxLoc】
      【Qt&OpenCV 图像的模板匹配 matchTemplate/minMaxLoc】
      115 1
      |
      8月前
      |
      存储 编解码 算法
      【Qt&OpenCV 检测图像中的线/圆/轮廓 HoughLinesP/HoughCircles/findContours&drawContours】
      【Qt&OpenCV 检测图像中的线/圆/轮廓 HoughLinesP/HoughCircles/findContours&drawContours】
      149 0
      |
      8月前
      |
      算法 计算机视觉
      【Qt&OpenCV 图像边缘检测 Sobel/Laplace/Canny】
      【Qt&OpenCV 图像边缘检测 Sobel/Laplace/Canny】
      99 0

      热门文章

      最新文章