图像 - 检测低对比度边缘

Image - detect low contrast edge

我有一张具有高对比度和低对比度过渡的图片。

我需要检测上图的边缘。我需要二进制图像。我可以使用 Sobel 运算符和阈值轻松检测黑色和“深色”蓝色边缘。

但是,“浅”蓝色和“浅”黄色之间的边缘存在问题。

我从平滑图像开始,每个通道都使用中值滤波器来去除噪声。

我已经尝试检测边缘的方法:

到目前为止,RGB 上的 Sobel 效果最好,但低对比度线也是低对比度。

进一步阈值删除这部分。我认为边缘所有低于某个灰度值的东西。如果我使用像 250 这样的高阈值,低对比度边缘的结果会更好,但其余边缘会被破坏。我也不喜欢低对比度边缘的间隙。

因此,如果我进一步更改阈值并说除白色外的所有边缘都是边缘,那么我到处都是边缘。

你有没有其他想法如何结合低对比度和高对比度边缘检测,使边缘尽可能没有间隙,也不会到处都是?

注意:为了测试,我主要使用 OpenCV,OpenCV 中没有的,我自己编程

IMO 这几乎是不可能的,如果你想要一个自动化的解决方案的话,如果完全可行的话。

这里我使用了 RGB space 中的二值化,通过将每个像素分配给代表蓝色和黄色的两种颜色中最接近的颜色。 (我选择了孤立的像素,但选择一个区域的平均值会更好。)

也许 k-means 分类器可以做到这一点?


更新:

这是 k-means 分类器可以给出的结果,有 5 个 类。

感谢 Yves 提出可能的解决方案。我在尝试这个方面玩得很开心,想分享一些实际的代码,作为我自己未来的参考。我刚刚在终端中使用了 ImageMagick,但是您可以在 Python 中使用 Wand.

做同样的事情

因此,要获得具有 5 种颜色的 K-means 聚类分割,您可以执行以下操作:

magick edge.png -kmeans 5 result.png

如果你想要检测到的颜色的样本,你可以这样做:

magick edge.png \( +clone -kmeans 5 -unique-colors -scale "%[width]x20\!" \) -background none -smush +10 result.png

关键词: Python, ImageMagick, wand, image processing, segmentation, k-means, clustering, swatch.