如何解决cv2.Canny是否执行高斯模糊?
我知道在使用Canny检测边缘之前,对图像应用高斯模糊非常重要。我的问题是:cv2.Canny()
本身是否会模糊?还是有必要在cv2.GaussianBlur()
之前应用cv2.Canny()
?关于这一点,文档尚不清楚。
解决方法
回想一下,在Python中使用OpenCV实际上是OpenCV的C ++接口的包装。可以在以下位置找到C ++中Canny边缘检测算法的实现文件: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,则不必模糊图像。
aperture
的{{1}}参数控制Sobel滤波器的大小(从1到7?),实际上它在获取导数之前会应用低通滤波器。不幸的是,尽管引用了高斯公式,但该文档并未明确说明该低通滤波器。
我敢打赌,实际上使用了二项式滤波器(与高斯近似)。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。