openCV与GIMP,openCV中的边缘检测失败

6 投票
1 回答
2711 浏览
提问于 2025-04-16 18:53

我正在使用OpenCV进行Sobel边缘检测,使用的参数如下:

cv.Sobel(mat, edgemat, 1, 1)
# mat -> source image
# edgemat -> taget output image 
# 1 -> xorder (int) – Order of the derivative x
# 1 -> yorder (int) – Order of the derivative y
# apertureSize (int) – Size of the extended Sobel kernel -> its by default set to 3

我还在GIMP上对这张图片进行了Sobel边缘检测。

源图像是:源图像 OpenCV的输出结果是 OpenCV输出 GIMP的输出结果是 GIMP输出

为什么OpenCV和GIMP的输出结果差别这么大呢?GIMP的输出质量简直比OpenCV好得多。

1 个回答

9

简单来说,你的做法是错的。可以看看这个文档。你现在计算的是图像的 d^2/(dx dy) 导数,这意味着“水平边缘在垂直方向上是怎么变化的”(或者说“垂直边缘在水平方向上是怎么变化的”)。对于一个垂直或水平的边缘,你应该得到零的结果,因为在与边缘垂直的方向上,它是没有变化的。所以,你用opencv的这一行代码根本不是在做边缘检测。你可能想要的是像sobel那样,参数设置为 1, 00, 1,然后把这些结果平方后加起来,最后再对结果开平方。这可能会得到类似GIMP所做的效果。

撰写回答