1

我知道在使用 Canny 检测边缘之前将高斯模糊应用于图像很重要。我的问题是:cv2.Canny()高斯模糊是自己做还是必须先cv2.GaussianBlur()申请cv2.Canny()?文档在这一点上并不清楚。

4

2 回答 2

4

回想一下,在 Python 中使用 OpenCV 实际上是 OpenCV 的 C++ 接口的包装器。Canny 边缘检测算法在 C++ 中的实现文件可以在这里找到:https ://github.com/opencv/opencv/blob/master/modules/imgproc/src/canny.cpp

如果您检查此来源,您会发现图像上没有任何模糊。然而,由于 Yves Daoust 的修正(见下文),Sobel 边缘检测算法被用于寻找梯度。有一个aperture输入参数指定 Sobel 核的大小。使用默认值意味着您使用的是 3 x 3 内核并且不应用模糊。但是,任何高于 3 x 3 的东西都将使用高斯核。因此,如果您想使用默认的 Sobel 内核,您需要自己应用模糊。如果您改变 Sobel 内核的大小,您不必自己执行模糊操作。

事实上,在他们演示 Canny 使用的官方 OpenCV 教程中,图像在检测之前被手动模糊:https ://docs.opencv.org/3.4/da/d5c/tutorial_canny_detector.html 。但是,由于您使用的是 3 x 3 Sobel 内核,因此他们在算法之前使用了 3 x 3 框过滤器。

tl;dr- 如果您决定使用默认孔径/Sobel 内核大小,则需要在使用 Canny 边缘检测算法之前自行模糊图像。如果大于 3,则不必模糊图像。

于 2020-08-25T07:03:39.130 回答
0

aperture参数Canny控制 Sobel 滤波器的大小(从 1 到 7 ?),它实际上在求导之前应用了低通滤波器。不幸的是,尽管引用了高斯滤波器,但文档并未明确说明该低通滤波器。

我敢打赌,实际上使用了二项式滤波器(它非常接近高斯)。

于 2020-08-26T09:06:13.463 回答