2

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

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

4

5 回答 5

3

我会在色彩空间和像素数上进行下采样,使用视觉方法(可能是均值偏移)并放大结果。

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

如果您需要平滑度,之后可以使用填充来平滑边缘。

还有一些想法(回应您的评论)。

1)你在下采样时混合了吗?y[i]=(x[2i]+x[2i+1])/2 这应该可以消除噪声。

2)你希望它有多快?

3)您尝试过动态均值偏移吗?(对于所有算法 x 的动态 x 也是谷歌)

于 2008-12-10T08:53:10.737 回答
2

不确定它是否太有效,但您可以尝试使用Kohonen 神经网络(或自组织图;SOM)对相似值进行分组,其中每个像素都包含原始颜色和位置,并且只有颜色用于科霍恩分组。

不过,您应该在实施此之前阅读,因为我对 Kohonen 网络的了解就其用于分组数据而言 - 所以我不知道您的场景的性能/可行性选项是什么。

还有Hopfield 网络。它们可以根据我阅读的内容进行分组。

于 2008-12-10T10:33:15.697 回答
0

我现在拥有的:

  1. 创建一个与输入图像大小相同的缓冲区,初始化为UNSEGMENTED.
  2. 对于图像中相应缓冲区值不是 的每个像素,UNSEGMENTED使用像素值淹没缓冲区。

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

    湾。洪水填充算法

可能的问题:

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

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

可能的增强:

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

于 2008-12-10T08:29:24.247 回答
0

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

于 2008-12-14T17:29:43.097 回答
0

洪水填充的替代方法是连接组件算法。所以,

  1. 廉价地分类您的像素。例如在颜色空间中划分像素。
  2. 运行 cc 以查找 blob
  3. 保留显着大小的 blob

这种方法广泛用于早期视觉方法。例如在开创性论文“ Blobworld: A System for Region-Based Image Indexing and Retrieval ”中。

于 2009-02-18T09:52:19.397 回答