1

我有一个 2D 标记图像(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 个循环)并填充表格(一个数组),然后我将从中计算中心和表面积。

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

4

1 回答 1

1

您可以将存在的center_of_mass函数scipy.ndimage.measurements用于第一个问题,然后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 的大小、标签数量、您使用的方法和这些函数的计时结果),那就太好了。

于 2015-01-25T13:55:50.050 回答