从二进制图像中获取n个最大区域

时间:2018-03-05 19:40:38

标签: python algorithm image-processing signal-processing

我给出了一个大的二进制图像(每个像素都是1或0)。

我知道在那个图像中有多个区域(一个区域被定义为一组由0包围的相邻1)。

我们的目标是找到最大的(就像素数或封闭区而言,现在两者都可以解决)

我目前的计划方法是:

  • 启动1s(或0s的坐标数组数组,无论是什么代表'命中')

  • 直到无法再执行任何步骤:

    • 对于当前区域(这是一组坐标)执行:

    • 查看是否有任何区域与当前区域接口,如果是则将它们添加到其他区域,如果没有继续下一次迭代

我的问题是:有没有更有效的方法来做到这一点,并且已经测试过(并行或GPU加速的奖励点)实现(在任何大型库中)?

2 个答案:

答案 0 :(得分:3)

您可以Flood Fill每个具有唯一ID的区域,将ID映射到该区域的大小。

答案 1 :(得分:2)

您想使用连通成分分析(a.k.a。标记)。它或多或少是你建议做的,但那里有非常有效的算法。 this question的答案解释了一些算法。另请参阅

This library收集不同的有效算法并进行比较。

在Python中,您可能想要使用OpenCV。 cv.connectedComponentsWithStats进行连通分量分析并输出统计数据,其中包括每个连通分量的区域。

关于你的建议:直接使用像素坐标而不是原始图像矩阵是非常低效的:在图像中查找相邻像素是微不足道的,在坐标列表中寻找相同的像素需要昂贵的搜索者。