OpenCV Python 边缘检测
在这里,边缘是指图像中物体的边界。OpenCV具有一个 cv2.Canny() 函数,通过实现Canny算法来识别图像中各种物体的边缘。
Canny边缘检测算法由John Canny开发。根据该算法,通过执行以下步骤确定物体的边缘:
第一步是减少图像中的噪点像素。这是通过应用5×5的高斯滤波器来实现的。
第二步是找到图像的强度梯度。第一阶段的平滑图像通过应用Sobel算子进行过滤,以获取水平和垂直方向的一阶导数(G x 和G y )。
均方根值给出边缘梯度,导数的正切倒数给出边缘的方向。
\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()