图像分割

Image Segmentation

所以我正在尝试编写一些代码来分割您在下图中看到的保险丝。我想出了两种方法:

1) 基于颜色。我使用 OpenCV 的 inRange 函数设置阈值。这种方法适用于除棕色保险丝以外的所有保险丝。棕色的保险丝和保险丝盒本身的颜色太相似了,所以很难区分。

2) 我考虑过对图像进行大量阈值处理,以便我可以使用 OpenCV SimpleBlobDetector 检测保险丝本身的白色 points/terminals。然后我根据彼此之间的距离过滤掉斑点。因为我知道保险丝的大小,所以我可以过滤掉无效的保险丝。这种方法适用于所有保险丝,但白色保险丝除外,因为它甚至出现在阈值最高的图像中。

我希望能得到有关如何分割此类图像的指示。背景减法有用吗?

我在分割方面的经验是,单一方法通常不适用于困难的分割。如果一种算法适用于除棕色以外的所有人,而另一种适用于除白色以外的所有算法,则两者的结合应该会产生完整的结果。我知道拥有一种优雅的算法很好,但我的许多最佳结果都不得不求助于多种技术的混合。

我会考虑将通道分为 rgb 和色调、饱和度和明度,然后分别查看每个通道。有时看起来颜色非常相似的棕色​​具有明显不同的饱和度或颜色通道值。添加和减去不同的通道有时也可以增强对比度。这很简单,但在许多情况下会产生快速简单的输出,可用于阈值、分水岭(见下文)或背景减法。

我想你可能也想试试 watershed algorithm. Many examples and explainations are available。 Watershed 要求您提供一个包含背景(保险丝盒和 table)和每个前景对象(保险丝)的遮罩。据我了解,您已经可以检测到保险丝上的触点,这样就完成了。

另一种方法是接受你看不到棕色保险丝。如果你能检测到空槽和所有其他颜色,你可以通过推论知道棕色槽在哪里。

它必须事先知道什么会起作用,而无需进行一些实验,但这应该会给您一些关于如何改进现有内容的想法。

C++ 中的基本彩色图像分割代码可在 https://github.com/imensedave/basic_vision_region_segmentation

获得

这种方法的技巧是在颜色区域增长之前完成边缘检测。