我给出了一个大的二进制图像(每个像素都是1或0)。
我知道在那个图像中有多个区域(一个区域被定义为一组由0包围的相邻1)。
我们的目标是找到最大的(就像素数或封闭区而言,现在两者都可以解决)
我目前的计划方法是:
启动1s(或0s的坐标数组数组,无论是什么代表'命中')
直到无法再执行任何步骤:
对于当前区域(这是一组坐标)执行:
查看是否有任何区域与当前区域接口,如果是则将它们添加到其他区域,如果没有继续下一次迭代
我的问题是:有没有更有效的方法来做到这一点,并且已经测试过(并行或GPU加速的奖励点)实现(在任何大型库中)?
答案 0 :(得分:3)
您可以Flood Fill每个具有唯一ID的区域,将ID映射到该区域的大小。
答案 1 :(得分:2)
您想使用连通成分分析(a.k.a。标记)。它或多或少是你建议做的,但那里有非常有效的算法。 this question的答案解释了一些算法。另请参阅connected-components。
This library收集不同的有效算法并进行比较。
在Python中,您可能想要使用OpenCV。 cv.connectedComponentsWithStats
进行连通分量分析并输出统计数据,其中包括每个连通分量的区域。
关于你的建议:直接使用像素坐标而不是原始图像矩阵是非常低效的:在图像中查找相邻像素是微不足道的,在坐标列表中寻找相同的像素需要昂贵的搜索者。