OpenCV Python - 边缘检测

这里的边缘指的是图像中物体的边界。 OpenCV 有一个 cv2.Canny() 函数,它通过实施 Canny 算法来识别图像中各种对象的边缘。

Canny 边缘检测算法由 John Canny 开发。 根据它,对象的边缘是通过执行以下步骤来确定的 −

第一步是减少图像中的噪声像素。 这是通过应用 5X5 高斯滤波器来完成的。

第二步涉及找到图像的强度梯度。 第一阶段的平滑图像通过应用Sobel算子进行滤波以获得水平和垂直方向(Gx和Gy)的一阶导数。

均方根值给出边缘梯度,导数的tan反比给出边缘方向。

$$\mathrm{Edge \:gradient\:G\:=\:\sqrt{G_x^2+G_y^2}}$$

$$\mathrm{Angle\:\theta\:=\:\tan^{-1}(\frac{G_{y}}{G_{x}})}$$

在获得梯度幅度和方向后,对图像进行全面扫描以去除可能不构成边缘的任何不需要的像素。

下一步是使用 minval 和 maxval 阈值执行滞后阈值。 小于 minval 和 maxval 的强度梯度是非边缘,因此被丢弃。 介于两者之间的那些根据它们的连通性被视为边缘点或非边缘。

所有这些步骤都是由 OpenCV 的 cv2.Canny() 函数执行的,该函数需要输入图像数组以及 minval 和 maxval 参数。


示例

这是 canny 边缘检测的例子。 相同的程序如下 −

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

输出

Canny 边缘