在 OpenCV 中只需要一个函数:cv2.Canny(),就可以完成以上几步。让我们看如何使用这个函数。这个函数的第一个参数是输入图像。第二和第三个分别是 minVal 和 maxVal。第三个参数设置用来计算图像梯度的 Sobel卷积核的大小,默认值为 3。最后一个参数是 L2gradient,它可以用来设定求梯度大小的方程。如果设为 True,就会使用我们上面提到过的方程,否则
使用方程:代替,默认值为 False
- 消除噪声:使用高斯平滑滤波器卷积降噪。
- 计算梯度幅值和方向:此处按照sobel滤波器的步骤来操作:(1)运用一对卷积阵列(分别作用于x和y方向),(2)计算梯度幅值和方向,梯度方向一般取0度、45度、90度、135度这4个可能的角度之一。
- 非极大值抑制:这一步排除非边缘像素,仅仅保留了一些细线条(候选边缘)
- 滞后阈值:滞后阈值需要两个阈值(高阈值和低阈值)
- (1)若某一像素位置的幅值超过高阈值,该像素被保留为边缘像素。
(2)若某一像素位置的幅值小于低阈值,该像素被排除。
(3)若某一像素位置的幅值在两个阈值之间,该像素仅仅在连接到一个高于高阈值的像素时被保留。
void Canny(inputArray,outputArray,double threshold1,double threshold2,int apertureSize=3,bool L2gradient=false)
*第一个参数,输入图像,且需为单通道8位图像。
*第二个参数,输出的边缘图。
*第三个参数,第一个滞后性阈值。用于边缘连接。
*第四个参数,第二个滞后性阈值。用于控制强边缘的初始段,高低阈值比在2:1到3:1之间。
*第五个参数,表明应用sobel算子的孔径大小,默认值为3。
*第六个参数,bool类型L2gradient,一个计算图像梯度幅值的标识,默认值false。
r=cv2.Canny(o,100,200)
o:原图像
100:最小阈值
200:最大阈值
import cv2
import numpy as np
import matplotlib.pyplot as plt
o=cv2.imread("image\\lena.bmp",cv2.IMREAD_GRAYSCALE)
r=cv2.Canny(o,100,200)
#使用cv2中的imshow()函数进行绘图
cv2.imshow("original",o)
cv2.imshow("result",r)
cv2.waitKey()
cv2.destroyAllWindows()
r1=cv2.Canny(o,100,200)
r2=cv2.Canny(o,64,128)
两个阈值threshold1和threshold2两个值越小,内容越丰富
import cv2
import numpy as np
o=cv2.imread("image\\lena.bmp",cv2.IMREAD_GRAYSCALE)
r1=cv2.Canny(o,100,200)
r2=cv2.Canny(o,64,128)
cv2.imshow("original",o)
cv2.imshow("result1",r1)
cv2.imshow("result2",r2)
cv2.waitKey()
cv2.destroyAllWindows()