openCV与GIMP,openCV中的边缘检测失败
我正在使用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的输出结果是
GIMP的输出结果是
为什么OpenCV和GIMP的输出结果差别这么大呢?GIMP的输出质量简直比OpenCV好得多。
1 个回答
9
简单来说,你的做法是错的。可以看看这个文档。你现在计算的是图像的 d^2/(dx dy)
导数,这意味着“水平边缘在垂直方向上是怎么变化的”(或者说“垂直边缘在水平方向上是怎么变化的”)。对于一个垂直或水平的边缘,你应该得到零的结果,因为在与边缘垂直的方向上,它是没有变化的。所以,你用opencv的这一行代码根本不是在做边缘检测。你可能想要的是像sobel那样,参数设置为 1, 0
和 0, 1
,然后把这些结果平方后加起来,最后再对结果开平方。这可能会得到类似GIMP所做的效果。