欢迎光临散文网 会员登陆 & 注册

【第15节】OpenCV中Canny边缘检测

2022-11-21 10:55 作者:海鸥之道  | 我要投稿

目标

  • 了解Canny边缘检测的概念

  • 学习函数CV2.Canny()

1、原理

        Canny边缘检测是一种非 常流行的边缘检测算法,是John F.Canny在1986年提出的。它是一个有很多步构成的算法,我们接下来会逐步介绍。

1.1 噪声去除

        由于边缘检测很容易受到噪声影响,所以是使用高斯滤波器去除噪声,这个前面我们已经学过了。

1.2 计算图像梯度

        对平滑后的图像使用Sobel 算子计算水平方向和竖直方向的一-阶导数(图像梯度)(Gx和Gy)。根据得到的这两幅梯度图(Gx和Gy)找到边界的梯度和方向,公式如下:

        梯度的方向一般总是与边界垂直。梯度方向被归为四类:垂直、水平和两个对角线。

1.3 非极大值抑制

        在获得梯度的方向和大小之后,应该对整幅图像做一个扫描,去除那些非边界上的点。对每一个像素进行检查,看这个点的梯度是不是周围具有相同梯度方向的点中最大的。如下图所示:

        现在你得到的是一个包含“窄边界”的二值图像。

1.4 滞后阈值

        现在要确定哪些边界才是真正的边界。这时我们需要设置两个阈值:minVal和maxVal。当图像的灰度梯度高于maxVal时被认为是真的边界,那些低于minVal的边界会被抛弃。如果介于两者之间的话,就要看这个点是否与某个被确定为真正的边界点相连,如果是就认为它也是边界点,如果不是就抛弃。如下图:

        A高于阈值maxVal所以是真正的边界点,C虽然低于maxVal但高于minVal并且与A相连,所以也被认为是真正的边界点。而B就会被抛弃,因为他不仅低于maxVal而且不与真正的边界点相连。所以选择合适的maxVal和minVal对于能否得到好的结果非常重要。在这一步一些小的噪声点也会被除去,因为我们假设边界都是一些长的线段。

2、OpenCV中的Canny边界检测

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

结果:











【第15节】OpenCV中Canny边缘检测的评论 (共 条)

分享到微博请遵守国家法律