找到标记对象的平均位置和面积

find mean position and area of labelled objects

我有一个带标签的二维图像(numpy 数组),每个标签代表一个对象。我必须找到物体的中心及其面积。我目前的解决方案:

centers = [np.mean(np.where(label_2d == i),1) for i in range(1,num_obj+1)]

surface_area = np.array([np.sum(label_2d == i) for i in range(1,num_obj+1)])

请注意,用于中心的 label_2d 与用于表面积的不同,因此我无法将这两种操作结合​​起来。我目前的代码大约要慢 10-100 倍。

在 C++ 中,我将遍历图像 一次(2 个循环)并填充 table(一个数组),然后我将从中计算中心和表面积。

由于 python 中的 for 循环非常慢,我必须找到另一个解决方案。有什么建议吗?

您可以使用 scipy.ndimage.measurements 中的 center_of_mass function 来解决第一个问题,然后使用 np.bincount 来解决第二个问题。因为这些都在主流库中,所以会进行大量优化,所以你可以期待不错的速度提升。

示例:

>>> import numpy as np
>>> from scipy.ndimage.measurements import center_of_mass
>>> 
>>> a = np.zeros((10,10), dtype=np.int)
>>> # add some labels:
... a[3:5, 1:3] = 1
>>> a[7:9, 0:3] = 2
>>> a[5:6, 4:9] = 3
>>> print(a)
[[0 0 0 0 0 0 0 0 0 0]
 [0 0 0 0 0 0 0 0 0 0]
 [0 0 0 0 0 0 0 0 0 0]
 [0 1 1 0 0 0 0 0 0 0]
 [0 1 1 0 0 0 0 0 0 0]
 [0 0 0 0 3 3 3 3 3 0]
 [0 0 0 0 0 0 0 0 0 0]
 [2 2 2 0 0 0 0 0 0 0]
 [2 2 2 0 0 0 0 0 0 0]
 [0 0 0 0 0 0 0 0 0 0]]
>>> 
>>> num_obj = 3
>>> surface_areas = np.bincount(a.flat)[1:]
>>> centers = center_of_mass(a, labels=a, index=range(1, num_obj+1))
>>> print(surface_areas)
[4 6 5]
>>> print(centers)
[(3.5, 1.5), (7.5, 1.0), (5.0, 6.0)]

虽然速度增益取决于输入数据的大小,因此我无法对此做出任何认真的估计。如果您可以在评论中添加该信息(a 的大小、标签数量、您使用的方法和这些函数的计时结果),那就太好了。