使用多级边缘算法检测边缘的方法。OpenCV提供了函数cv2.Canny()实现Canny边缘检测。

Canny边缘检测基础

Canny边缘检测分为一下几个步骤:

1、去噪。

2、计算梯度的幅度和方向。

3、非极大值抑制,即适当地让边缘“变瘦”。

4、确定边缘。使用双阈值算法确定最终的边缘信息。

高斯滤波去噪

滤波的目的是平滑一些纹理较弱的非边缘区域,以便得到更准确的边缘。在实际处理过程中,一般采用高斯滤波。

在使用高斯滤波时,核的大小是可以变化的。高斯核的大小对于边缘检测的效果具有很重要的作用。

核越大,对于噪声的敏感度就越低。但定位错误也会随之增加。一般5X5的核能够满足大多数的要求。

计算梯度的幅度和方向

梯度的方向总是有边缘垂直的。通常就近取值为水平(左、右)、垂直(上、下)、对角线(右上、左上、左下、右下)8个不同的方向。

非极大值抑制

顾名思义就是抑制不是极大值的元素,可以理解为局部最大搜索。

  • 如果改点是正/负梯度方向上的局部最大值,则保留改点
  • 如果不是,则抑制改点(归零)

下图中,黑色背景的点都是向上方向梯度(水平边缘)的局部最大值。因此,这些点会被保留,其余点被抑制(处理为0)。

对于同一方向的若干个边缘点,基本上只保留了一个。因此实现了边缘细化的目的。

双阈值确定边缘

(1) 根据图像选取合适的高阈值和低阈值,通常高阈值是低阈值的2到3倍
(2) 如果某一像素的梯度值高于高阈值,则保留
(3) 如果某一像素的梯度值低于低阈值,则舍弃
(4) 如果某一像素的梯度值介于高低阈值之间,则从该像素的8邻域的寻找像素梯度值,如果存在像素梯度值高于高阈值,则保留,如果没有,则舍弃。

边缘分类的处理结果示意

Canny函数及使用

edges = cv.Canny(img, threshold1, threshold2[ ,aperatureSize[ ,L2gradient]] )
  • edges为计算的结果边缘图像
  • image是输入边缘图像
  • threshold1是处理的第一个阈值
  • threshold2是处理的第二个阈值
  • apertureSize表示Sobel算子的孔径大小
  • L2gradient表示为计算图像梯度幅度的标识。其默认值为False。如果为True,则使用精度更高的L2范数进行计算。
import cv2
img1 = cv2.imread(r'E:\Blog\OpenCV\mn.png',0)
r1 = cv2.Canny(img1,128,200)  
r2 = cv2.Canny(img1,25,70)  
cv2.imshow('ORIGINAL',img1)
cv2.imshow('canny1',r1)
cv2.imshow('canny2',r2)
cv2.waitKey()

获得边缘

threshold1、threshold2较小时,能够捕捉更多的边缘信息。


博主个人公众号
版权声明 ▶ 本网站名称:陶小桃Blog
▶ 本文链接:https://www.52txr.cn/2022/OpenCV31.html
▶ 本网站的文章部分内容可能来源于网络,仅供大家学习与参考,如有侵权,请联系站长进行核实删除。
▶ 转载本站文章需要遵守:商业转载请联系站长,非商业转载请注明出处!!

最后修改:2022 年 05 月 28 日
如果觉得我的文章对你有用,请随意赞赏