python opencv 边缘检测_OpenCV-Python-边缘检测

Canny边缘检测方法被誉为边缘检测的最优方法。

importcv2import numpy as np

img = cv2.imread('handwriting.jpg', 0)

edges= cv2.Canny(img, 30, 70) #canny边缘检测

cv2.imshow('canny', np.hstack((img, edges)))

cv2.waitKey(0)

1490325-20190415153055276-1063446696.png

cv2.Canny()进行边缘检测,参数2、参数3表示最低和最高阈值。

Canny边缘检测

具体步骤如下:

1. 使用5x5高斯滤波消除噪声:

边缘检测本身属于锐化操作,对噪声比较敏感,所以需要进行平滑处理。高斯滤波的具体内容参考前篇:OpenCV-Python教程9-平滑图像

1490325-20190415155028635-685974011.png

2. 计算图像梯度的方向:

首先使用Sobel算子计算两个方向上的梯度Gx和Gy,然后算出梯度的方向:

1490325-20190415155211687-182296028.png

保留这四个方向上的梯度:0°、45°、90°、135°

3. 取局部最大值:

在四个角度方向上取局部最大值

4. 滞后阈值

经过前面三步,剩下0和可能的边缘梯度值。通过设定两个阈值来筛选阈值:

1490325-20190415155736544-2016158367.jpg

像素点的值大于最高阈值,那肯定是边缘(上图A)

像素值小于最低阈值,那肯定不是边缘

像素值介于两者之间,如果高于最高阈值的点连接,也算边缘。所以C算,B不算

Canny推荐的高低阈值比在 2 : 1 到 3 : 1 之间

先阈值分割后检测

很多情况下,先阈值分割后再检测边缘,效果会更好:

#先阈值分割后检测

_, thresh = cv2.threshold(img, 0, 255, cv2.THRESH_BINARY +cv2.THRESH_OTSU)

edges= cv2.Canny(thresh, 30, 70)

cv2.imshow('canny', np.hstack((img, thresh, edges)))

cv2.waitKey(0)

1490325-20190415160403202-1526312765.png

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值