English 中文(简体)
我如何高效地将二维图像分割成具有相似数值的区域/斑块?
原标题:
  • 时间:2008-12-10 08:13:31
  •  标签:

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

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

最佳回答

我会对像素进行降采样、颜色空间进行处理,并使用视觉方法(可能是均值漂移),然后将结果进行升采样。

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

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

一些更多的想法(作为对您评论的回应)。

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

你想让它有多快?

你有尝试过动态均值漂移吗?(同时在Google上搜索所有算法x的动态x)

问题回答

不确定是否效率过高,但您可以尝试使用 Kohonen 神经网络(或“自组织映射”),将相似值分组,在其中每个像素包含原始颜色和位置,仅使用颜色进行 Kohohen 分组。

你应该在实施之前先了解一下,因为我的 Kohonen 神经网络的了解仅限于它用于分组数据——所以我不知道对于你的情况,性能/可行性选项是什么。

还有 Hopfield 神经网络。据我所知,它们可以被改编成分组形式。

我现在拥有的是:

  1. Make a buffer of the same size as the input image, initialized to UNSEGMENTED.
  2. 对于图像中每个相应缓冲值不为UNSEGMENTED的像素,使用像素值淹没缓冲区。

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

    b. 漫水填充算法。

可能存在的问题:

洪水填充算法中,2.a. s边界检查被多次调用。如果我能使用边缘检测预先计算边界,它就可以变成查找,但这可能比当前的检查时间更长。

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

可能的提升:

与其检查每个像素是否为未分割,我可以随机选择几个点。如果您期望有大约10个blob,则以该顺序选择随机点可能足够。缺点是您可能会错过一个有用但较小的blob。

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

洪水填充的替代方案是连通组件算法。因此,

  1. Cheaply classify your pixels. e.g. divide pixels in colour space.
  2. Run the cc to find the blobs
  3. Retain the blobs of significant size

这种方法在早期视觉方法中被广泛使用,例如在具有开创性的论文“Blobworld:基于区域的图像索引与检索系统”中。





相关问题
热门标签