OpenCV-Python学习之路-11:Canny Edge Detection (Canny边缘检测)

文章目录

    • 参考依据
    • 目标
    • Canny边缘检测
      • 1. 去噪
      • 2. 寻找图像中的梯度强度
      • 3. 非极大值抑制
      • 4. 双阈值检测
    • OpenCV中的Canny边缘检测

参考依据

OpenCV官方文档:https://opencv-python-tutroals.readthedocs.io/en/latest/py_tutorials/py_imgproc/py_canny/py_canny.html

目标

  1. 掌握Canny边缘检测的概念
  2. 了解对应的OpenCV函数:cv2.Canny()

Canny边缘检测

Canny边缘检测算法是1986年由JOHN CANNY提出的,并且时至今日其仍是一个非常优秀的边缘检测算法,它是一个多阶段算法:

1. 去噪

由于边缘检测容易受到图像噪声的影响,所以Canny算法第一步就是使用一个5x5的高斯滤波器进行平滑滤波,去除噪声。

2. 寻找图像中的梯度强度

平滑处理后的图像会使用Sobel kernel在水平方向、垂直方向进行卷积运算,得到x、y方向上的一阶导数(Gx)、(Gy),接着使用下式计算每个像素点的梯度强度及方向:
OpenCV-Python学习之路-11:Canny Edge Detection (Canny边缘检测)_第1张图片
梯度方向总是垂直于边缘的,进行舍入变化,将方向舍入为四个角度之一(垂直、水平以及两个对角线,8个方向)。

3. 非极大值抑制

得到所有像素点的梯度强度与方向之后,对全图进行一个扫描,去除那些无法构成边缘的像素。在每个像素处,检查像素在梯度方向上是否为附近的局部最大值。如下图所示:
OpenCV-Python学习之路-11:Canny Edge Detection (Canny边缘检测)_第2张图片
其中点A在边缘上(垂直方向),梯度方向为水平方向,与边缘垂直。点B和点C也在梯度方向上,将点A与B、C比较,如果点A为局部最大值,那么进入下一阶段;否则,点A将被抑制(置为0)。

使用非极大值抑制处理后,可以得到一个‘边缘很细’的二值化图像。

4. 双阈值检测

这个阶段用来最后确定哪些边缘为真正边缘,首先需要设置两个阈值,maxVal以及minVal。所有梯度强度大于maxVal的边缘部分可以视为‘sure-edge’,进行保留;小于minVal视为‘non-edge’,可以丢弃。在两者之间的那部分,根据其与‘sure-edge’的连通性来判断,如下图所示:

A大于maxVal,为‘sure-edge’;C小于maxVal,大于minVal,但其与A连通,所以也为’sure-edge’,而B与’sure-edge’之间没有连通,所以为‘non-edge’。
OpenCV-Python学习之路-11:Canny Edge Detection (Canny边缘检测)_第3张图片
因此,minVal和maxVal的选择对于Canny检测结果有着很大的影响。

经过上述4步,最终得到的结果就为Canny检测的边缘。

OpenCV中的Canny边缘检测

OpenCV提供了一个接口方便我们很容易地来调用Canny检测,cv2.Canny()

Python: cv2.Canny(image, threshold1, threshold2[, edges[, apertureSize[, L2gradient]]]) → edges

首先需要传入待检测的image;
其次传入minVal、maxVal两个阈值;
然后可以设置apertureSize(用于寻找图像梯度的Sobel kernel尺寸,默认为3);
最后一个参数为L2gradient(默认为false),它决定了梯度强度求解的具体公式,如果为True,使用之前2中提到的计算公式,如果为false,使用下式计算:
在这里插入图片描述

canny = cv2.Canny(img, 200, 230)
plt.subplot(121), plt.imshow(img, cmap='gray'), plt.title('原图')
plt.subplot(122), plt.imshow(canny, cmap='gray'), plt.title('Canny')
plt.show()

OpenCV-Python学习之路-11:Canny Edge Detection (Canny边缘检测)_第4张图片
使用的示例为Image Gradients(图像梯度)中的例子,可与Sobel、Scharr以及Laplacian等检测方案进行比较。

你可能感兴趣的:(玩玩OpenCV,opencv,算法,python,计算机视觉)