OpenCV Python - 边缘检测


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

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

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

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

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

$$\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 参数。

例子

这是精明边缘检测的示例。其程序如下 -

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()

输出

精明的边缘