cv2.Canny() 是否执行高斯模糊?

DLo*_*pez 4 python opencv image-processing edge-detection canny-operator

我知道在使用 Canny 检测边缘之前对图像应用高斯模糊非常重要。我的问题是:cv2.Canny()高斯模糊是单独进行还是有必要在cv2.GaussianBlur()之前应用cv2.Canny()?文档在这一点上并不清楚。

ray*_*ica 7

回想一下,在 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 内核的大小,则无需自己执行模糊处理。

事实上,在 OpenCV 官方教程中,他们演示了 Canny 的使用,在检测之前对图像进行了手动模糊处理:https://docs.opencv.org/3.4/da/d5c/tutorial_canny_detector.html。然而,他们在算法之前使用 3 x 3 盒式过滤器,因为您使用的是 3 x 3 Sobel 内核。

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

  • @Yves,高斯和索贝尔的模糊之间有很多区别。Sobel核在垂直于导数的方向上使用了3-tab三角核,并且在导数方向上没有模糊。我不知道谁提出了 Sobel 内核的更大扩展,也不知道它们是如何设计的。但它们不是 Sobel 内核,Sobel 描述了一个 3x3 内核,不要去给这个人分配其他随机的东西! (3认同)
  • 该教程非常具有误导性。它提倡 5x5 高斯内核,尽管代码使用 3x3 盒式滤波器并使用 3x3 孔径调用 Canny ! (2认同)