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