OpenCV--cv2.Canny()边缘检测

 在进行边缘之前需要对图像进行模糊处理。OpenCV提供的模糊滤波函数,如blur(),medianBlur()以及GaussianBlur(),其中GaussianBlur()在下面链接有介绍。

http://opencv-python-cv2.GaussianBlur()函数介绍_weixin_52012241的博客-CSDN博客

边缘检测

语法定义如下:

edge = cv2.Canny(image, threshold1, threshold2[, edges[, apertureSize[, L2gradient ]]]) 

image:要检测的图像
threshold1:阈值1(最小值)
threshold2:阈值2(最大值),使用此参数进行明显的边缘检测
edges:图像边缘信息
apertureSize:sobel算子(卷积核)大小
L2gradient :布尔值。
True: 使用更精确的L2范数进行计算(即两个方向的导数的平方和再开方)
False:使用L1范数(直接将两个方向导数的绝对值相加)

Canny边缘检测算法可以分为以下5个步骤:

1)        使用高斯滤波器,以平滑图像,滤除噪声。

2)        计算图像中每个像素点的梯度强度和方向。

3)        应用非极大值(Non-Maximum Suppression)抑制,以消除边缘检测带来的杂散响应。

4)        应用双阈值(Double-Threshold)检测来确定真实的和潜在的边缘。

5)        分析所有的边缘及其之间的连接,以保留真正的边缘并消除不明显的边缘。

目录

1、阈值对检测结果的影响

2、sobel算子对检测结果的影响

3、范数对检测结果的影响

原始图像

1、阈值对检测结果的影响

img=cv2.imread('./12.jpg')
img = cv2.resize(img, None, fx=0.5, fy=0.5,
                   interpolation=cv2.INTER_CUBIC)#调整图片大小
r1=cv2.Canny(img,128,200)
r2=cv2.Canny(img,0, 50)
cv2.imshow("original",img)
cv2.imshow("result1",r1)
cv2.imshow("result2",r2)
cv2.imwrite("result1.jpg",r1)
cv2.imwrite("result2.jpg",r2)
cv2.waitKey()
cv2.destroyAllWindows()

 左边是原图,中间是result1,右边是result2,如图的结果可知:阈值越小会获得更多的细节,提取图像更多边缘。

2、sobel算子对检测结果的影响

img=cv2.imread('./12.jpg')
img = cv2.resize(img, None, fx=0.5, fy=0.5,
                   interpolation=cv2.INTER_CUBIC)#调整图片大小
r1=cv2.Canny(img,128,200,apertureSize=3)
r2=cv2.Canny(img,128,200,apertureSize=5)
cv2.imshow("original",img)
cv2.imshow("result1",r1)
cv2.imshow("result2",r2)
cv2.imwrite("result1.jpg",r1)
cv2.imwrite("result2.jpg",r2)
cv2.waitKey()
cv2.destroyAllWindows()

左边是原图,中间是result1,右边是result2,如图的结果可知:增大算子,会获得更多的细节,提取图像更多边缘。

3、范数对检测结果的影响

img=cv2.imread('./12.jpg')
img = cv2.resize(img, None, fx=0.5, fy=0.5,
                   interpolation=cv2.INTER_CUBIC)#调整图片大小
r1=cv2.Canny(img,128,200,L2gradient=False)
r2=cv2.Canny(img,128,200,L2gradient=True)
cv2.imshow("original",img)
cv2.imshow("result1",r1)
cv2.imshow("result2",r2)
cv2.imwrite("result1.jpg",r1)
cv2.imwrite("result2.jpg",r2)
cv2.waitKey()
cv2.destroyAllWindows()

左边是原图,中间是result1,右边是result2,如图的结果可知:L2gradient=True时,检测出的边缘减少了

  • 5
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值