从二值图像中获取 n 个最大区域
Get n largest regions from binary image
我给出了一个大的二值图像(每个像素要么是 1 要么是 0)。
我知道在那个图像中有多个区域(区域定义为一组由 0 包围的相邻 1)。
目标是找到最大的(就像素数或封闭区域而言,目前两者都适合我)
我目前计划的方法是:
start array of array of coordinates of the 1s (or 0s, whatever represent a 'hit')
直到没有更多的步骤:
对于当前区域(这是一组坐标)做:
查看是否有任何区域与当前区域接口,如果有则将它们加在一起,如果没有则继续下一次迭代
我的问题是:是否有更有效的方法来执行此操作,是否已经(在任何大型库中)测试了(并行或 GPU 加速的加分)实现?
您可以 Flood Fill 每个区域都有一个唯一的 ID,将 ID 映射到区域的大小。
您想使用连通分量分析(a.k.a。标记)。这或多或少是你建议做的,但那里有非常有效的算法。 this question explain some of the algorithms. See also connected-components.
的答案
This library收集不同的高效算法并进行比较
在 Python 中,您可能想使用 OpenCV。 cv.connectedComponentsWithStats
进行连通分量分析并输出统计信息,其中包括每个连通分量的面积。
关于您的建议:直接使用像素坐标而不是原始图像矩阵是非常低效的:在图像中寻找相邻像素是微不足道的,在坐标列表中寻找相同像素需要昂贵的搜索器。
我给出了一个大的二值图像(每个像素要么是 1 要么是 0)。
我知道在那个图像中有多个区域(区域定义为一组由 0 包围的相邻 1)。
目标是找到最大的(就像素数或封闭区域而言,目前两者都适合我)
我目前计划的方法是:
start array of array of coordinates of the 1s (or 0s, whatever represent a 'hit')
直到没有更多的步骤:
对于当前区域(这是一组坐标)做:
查看是否有任何区域与当前区域接口,如果有则将它们加在一起,如果没有则继续下一次迭代
我的问题是:是否有更有效的方法来执行此操作,是否已经(在任何大型库中)测试了(并行或 GPU 加速的加分)实现?
您可以 Flood Fill 每个区域都有一个唯一的 ID,将 ID 映射到区域的大小。
您想使用连通分量分析(a.k.a。标记)。这或多或少是你建议做的,但那里有非常有效的算法。 this question explain some of the algorithms. See also connected-components.
的答案This library收集不同的高效算法并进行比较
在 Python 中,您可能想使用 OpenCV。 cv.connectedComponentsWithStats
进行连通分量分析并输出统计信息,其中包括每个连通分量的面积。
关于您的建议:直接使用像素坐标而不是原始图像矩阵是非常低效的:在图像中寻找相邻像素是微不足道的,在坐标列表中寻找相同像素需要昂贵的搜索器。