如何有效地将 2D 图像分割成具有相似值的区域/斑点?
-
21-08-2019 - |
题
如何有效地将 2D 图像分割成具有相似值的斑点?给定的输入是一个n整数数组,其中包括非灰色像素的色调和灰色像素的亮度。
我正在使用 Java 编写一个虚拟移动机器人,并使用分割来分析地图以及来自相机的图像。这是一个众所周知的问题 计算机视觉, ,但是当它在机器人上时,性能确实很重要,所以我想要一些输入。算法才是最重要的,所以你可以用任何语言发布代码。
- 维基百科文章: 分割(图像处理)
- [PPT]斯坦福CS-223-B讲座11 分割与分组 (这表明均值平移可能是迄今为止最好的技术)
- 均值平移图片 (论文也可从 多林·科曼尼丘)
解决方案
我会在颜色空间和像素数量中进行下采样,使用视觉方法(可能是均值漂移)并放大结果。
这很好,因为下采样还可以提高对噪声的鲁棒性,并使您更有可能获得有意义的片段。
如果您需要平滑度,可以随后使用洪水填充来平滑边缘。
更多想法(回应您的评论)。
1) 下采样时是否进行了混合?y[i]=(x[2i]+x[2i+1])/2 这应该消除噪声。
2)你希望它有多快?
3)你尝试过动态均值漂移吗?(还可以在谷歌上搜索所有算法的动态x x)
其他提示
不确定它是否太有效,但你可以尝试使用 Kohonen 神经网络 (或者,自组织映射;SOM)对相似值进行分组,其中每个像素包含原始颜色和位置,并且仅颜色用于 Kohohen 分组。
不过,在实现此功能之前,您应该先阅读一下,因为我对 Kohonen 网络的了解仅限于它用于对数据进行分组 - 所以我不知道您的场景的性能/可行性选项是什么。
还有 霍普菲尔德网络公司. 。根据我读到的内容,它们可以被分成不同的组。
我现在拥有的:
- 创建一个与输入图像大小相同的缓冲区,初始化为
UNSEGMENTED
. 对于图像中对应的缓冲区值不存在的每个像素
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)。它应该通过提供各种可能的细分过滤器来在调查阶段为您提供帮助。
洪水填充的替代方案是 连接组件 算法。所以,
- 廉价地对像素进行分类。例如在颜色空间中划分像素。
- 运行 cc 来查找 blob
- 保留较大尺寸的斑点
这种方法广泛应用于早期视觉方法中。例如,在开创性论文中“斑点世界:基于区域的图像索引和检索系统".