OpenCV Python Canny 边缘检测是否应该根据图像大小给我非常不同的结果?

Should OpenCV Python Canny edge detection be giving me very different results depending on image size?

我正在从视频帧导入图像,使用 cv2.resize() 将图像放大 4 倍,然后使用 Canny 边缘检测帮助去除一些噪声,然后再进行一些对象跟踪。然而,Canny 边缘检测一直给我一个黑色图像。

经过多次测试,我发现使用 cv2.resize() 将图像大小减小到 1/4,然后 Canny 边缘检测给出了我希望的结果。将图像尺寸缩小到 1/3 也给我带来了更好的结果,但边缘比缩小到 1/4 时更少,而将图像缩小到 1/16 比缩小到 1/4 得到的边缘更多。为什么会这样?实际上,在写这个问题时,我正在调整未缩放结果的大小,我发现调用 namedWindow 和 cv.WINDOW_NORMAL 也改善了它。

我意识到我可以简单地缩小比例,运行 Canny 检测,然后放大 Canny 边缘检测的结果并进行对象跟踪,但这让我感到困惑,知道为什么会这样我自己很感兴趣,我也认为其他人也很感兴趣。我在 opencv 文档中找不到任何内容表明 Canny 算法对图像大小的依赖性。

见下图,全部由output = cv2.Canny(input, 30, 50):

生成

未缩放(使用 cv.WINDOW_NORMAL 改进) https://i.imgur.com/uG93Dhd.png

1/4 在 Canny 检测之前减少 https://i.imgur.com/dQP9bxB.png

1/3 在 Canny 检测之前减少 https://i.imgur.com/MkSpaT5.png

1/16 在 Canny 检测之前减少 https://i.imgur.com/SbpPkYP.png

通过调整大小,您可以更改要素的大小。但由于您不更改过滤器大小,因此结果会有所不同。你实际上是在探索规模-space.

另请注意,resize 函数不会对图像进行预过滤并导致混叠。