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

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

有帮助吗?

解决方案

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

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

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

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

1) 下采样时是否进行了混合?y[i]=(x[2i]+x[2i+1])/2 这应该消除噪声。

2)你希望它有多快?

3)你尝试过动态均值漂移吗?(还可以在谷歌上搜索所有算法的动态x x)

其他提示

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

不过,在实现此功能之前,您应该先阅读一下,因为我对 Kohonen 网络的了解仅限于它用于对数据进行分组 - 所以我不知道您的场景的性能/可行性选项是什么。

还有 霍普菲尔德网络公司. 。根据我读到的内容,它们可以被分成不同的组。

我现在拥有的:

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

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

    b. 洪水填充算法.

可能的问题:

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

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

可能的增强:

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

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

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

  1. 廉价地对像素进行分类。例如在颜色空间中划分像素。
  2. 运行 cc 来查找 blob
  3. 保留较大尺寸的斑点

这种方法广泛应用于早期视觉方法中。例如,在开创性论文中“斑点世界:基于区域的图像索引和检索系统".

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top