图像分割
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
获得
这种方法的技巧是在颜色区域增长之前完成边缘检测。
所以我正在尝试编写一些代码来分割您在下图中看到的保险丝。我想出了两种方法:
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
获得这种方法的技巧是在颜色区域增长之前完成边缘检测。