Canny边缘检测

在 OpenCV 中只需要一个函数:cv2.Canny(),就可以完成以上几步。让我们看如何使用这个函数。这个函数的第一个参数是输入图像。第二和第三个分别是 minVal 和 maxVal。第三个参数设置用来计算图像梯度的 Sobel卷积核的大小,默认值为 3。最后一个参数是 L2gradient,它可以用来设定求梯度大小的方程。如果设为 True,就会使用我们上面提到过的方程,否则
使用方程:代替,默认值为 False

  1. 消除噪声:使用高斯平滑滤波器卷积降噪。
  2. 计算梯度幅值和方向:此处按照sobel滤波器的步骤来操作:(1)运用一对卷积阵列(分别作用于x和y方向),(2)计算梯度幅值和方向,梯度方向一般取0度、45度、90度、135度这4个可能的角度之一。
  3. 非极大值抑制:这一步排除非边缘像素,仅仅保留了一些细线条(候选边缘)
  4. 滞后阈值:滞后阈值需要两个阈值(高阈值和低阈值) 
  5. (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()

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值