OpenCV Python - 边缘检测



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

Canny 边缘检测算法是由 John Canny 开发的。根据该算法,物体的边缘是通过执行以下步骤确定的:

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

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

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

$$\mathrm{边缘梯度G\:=\:\sqrt{G_x^2+G_y^2}}$$

$$\mathrm{角度\:\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 Edge
广告