如何有效地将2D图像分割成具有相似值的blob?给定的输入是一个n整数数组,包括非灰色像素的色调和灰色像素的亮度。
我正在使用Java编写虚拟移动机器人,我正在使用分段来分析地图以及来自相机的图像。这是Computer Vision中一个众所周知的问题,但是当它在机器人上时性能确实很重要,所以我想要一些输入。算法非常重要,因此您可以使用任何语言发布代码。
答案 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)
我现在拥有的:
UNSEGMENTED
。对于图像中相应缓冲区值不是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。
答案 3 :(得分:0)
查看Eyepatch(eyepatch.stanford.edu)。它应该在调查阶段通过提供各种可能的分割过滤器来帮助您。
答案 4 :(得分:0)
泛洪填充的替代方法是connnected-components算法。所以,
这种方法广泛用于早期视觉方法。例如,在开创性的论文“Blobworld: A System for Region-Based Image Indexing and Retrieval”中。