找到标记对象的平均位置和面积
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 的大小、标签数量、您使用的方法和这些函数的计时结果),那就太好了。
我有一个带标签的二维图像(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 的大小、标签数量、您使用的方法和这些函数的计时结果),那就太好了。