opencv python 8 Canny边缘检测
Canny边缘检测算法分为以下几步:
- 去除噪声
边缘检测算法受噪声影响较大,所以先使用5x5的高斯滤波去除噪声。 - 计算图像梯度
经过高斯平滑的图像分别在水平和垂直方向上用sober算子计算得到一阶导数Gx和Gy,以及角度θ:
- 非极大值抑制
得到梯度大小和方向后扫描整张图像,移除不是边缘组成部分的像素。对每个像素,检查是否是梯度方向上邻域中的最大值。
对于点A,检查梯度方向上的相邻点B和C,若A是最大值则进入下一步,否则置为0。 - 阈值处理
对于给定的最大阈值和最小阈值,大于最大阈值的梯度必定为边缘,小于最小阈值的梯度必定不为边缘,对于中间部分,如果与必定为边缘的像素相连,则也视为边缘。
点A必定为边缘,C在最大最小阈值之间且与A相连所以视为边缘,B不为边缘。
在opencv中使用cv2.Canny()实现该检测算法。
edges = cv2.Canny(image, threshold1, threshold2[, edges[, apertureSize[, L2gradient]]])
- edges:输出的边缘图像
- image:输入图像
- threshold1:第1个阈值
- threshold2:第2个阈值,两个阈值中较小的作为最小阈值,较大的作为最大阈值
- apertureSize:Sobel算子宽度,默认为3
- L2gradient:是否使用L2梯度,默认为false
import cv2
img = cv2.imread('a.jpg', 0)
edges = cv2.Canny(img, 100, 200)
cv2.imshow('edges', edges)
cv2.waitKey()