如何有效地将2D图像分割成具有相似值的区域/ blob?

时间:2008-12-10 08:13:32

标签: algorithm image-processing computer-vision mobile-robots

如何有效地将2D图像分割成具有相似值的blob?给定的输入是一个n整数数组,包括非灰色像素的色调和灰色像素的亮度。

我正在使用Java编写虚拟移动机器人,我正在使用分段来分析地图以及来自相机的图像。这是Computer Vision中一个众所周知的问题,但是当它在机器人上时性能确实很重要,所以我想要一些输入。算法非常重要,因此您可以使用任何语言发布代码。

5 个答案:

答案 0 :(得分:3)

我会在colourspace和像素数下采样,使用视觉方法(可能是meanshift)并升级结果。

这很好,因为下采样也会增加对噪声的鲁棒性,并使您更有可能获得有意义的段。

如果你需要光滑度,你可以使用填充物来平滑边缘。

更多想法(回应你的评论)。

1)你在下采样时是否融合了? y [i] =(x [2i] + x [2i + 1])/ 2这应该消除噪音。

2)你想要多快?

3)您是否尝试过动态的meanshift?(对于所有算法x,也是google for dynamic x)

答案 1 :(得分:2)

不确定它是否效率太高,但您可以尝试使用Kohonen neural network(或自组织地图; SOM)对相似值进行分组,其中每个像素包含原始颜色和位置,仅包含颜色用于Kohohen分组。

你应该在实现之前阅读,因为我对Kohonen网络的了解甚至用于分组数据 - 所以我不知道你的场景的性能/可行性选项。 / p>

还有Hopfield Networks。他们可以从我读到的内容中分组。

答案 2 :(得分:0)

我现在拥有的:

  1. 制作与输入图像大小相同的缓冲区,初始化为UNSEGMENTED
  2. 对于图像中相应缓冲区值不是UNSEGMENTED的每个像素,使用像素值填充缓冲区。

    一个。通过检查像素是否在原始像素值的EPSILON(当前设置为10)内来完成泛洪的边界检查。

    Flood filling algorithm

  3. 可能的问题:

    在洪水填充算法中多次调用2.a.的边界检查。如果我可以使用边缘检测预先计算边界,我可以将其转换为查找,但这可能会增加比当前检查更多的时间。

    private boolean isValuesCloseEnough(int a_lhs, int a_rhs) {
        return Math.abs(a_lhs - a_rhs) <= EPSILON;
    }
    

    可能的增强:

    我可以随机选择几个点,而不是检查UNSEGMENTED的每个像素。如果您期望大约10个blob,那么按顺序选择随机点就足够了。缺点是你可能会错过一个有用但很小的blob。

答案 3 :(得分:0)

查看Eyepatch(eyepatch.stanford.edu)。它应该在调查阶段通过提供各种可能的分割过滤器来帮助您。

答案 4 :(得分:0)

泛洪填充的替代方法是connnected-components算法。所以,

  1. 便宜地对像素进行分类。例如划分颜色空间中的像素。
  2. 运行cc以查找blob
  3. 保留显着大小的斑点
  4. 这种方法广泛用于早期视觉方法。例如,在开创性的论文“Blobworld: A System for Region-Based Image Indexing and Retrieval”中。