【发布时间】:2021-11-17 23:40:14
【问题描述】:
我有一个存储为 2D numpy 数组的图像掩码,其中的值指示图像中是否存在已分割的对象(0 = 无对象,1..n = 对象 1 到 n)。我想为每个表示对象中心的对象获取一个坐标。它不必是完全准确的质心或重心。我只是取数组中包含每个对象的所有单元格的 x 和 y 索引的平均值。我想知道是否有比我目前的方法更快的方法:
for obj in np.unique(mask):
if obj == 0:
continue
x, y = np.mean(np.where(mask == obj), axis=1)
这是一个可重现的例子:
import numpy as np
mask = np.array([
[0,0,0,0,0,2,0,0,0,0],
[0,1,1,0,2,2,2,0,0,0],
[0,0,1,0,2,2,2,0,0,0],
[0,0,0,0,0,0,0,0,0,0],
[0,3,3,3,0,0,4,0,0,0],
[0,0,0,0,0,4,4,4,0,0],
[0,0,0,0,0,0,4,0,0,0],
])
points = []
for obj in np.unique(mask):
if obj == 0:
continue
points.append(np.mean(np.where(mask == obj), axis=1))
print(points)
这个输出:
[array([1.33333333, 1.66666667]),
array([1.28571429, 5. ]),
array([4., 2.]),
array([5., 6.])]
【问题讨论】:
-
定义“慢”的含义。
-
这与是否有更快的方法有什么关系?
-
你能做一些可重现的例子吗?
-
请注意,
x和y似乎倒置了。但我认为关于这个国家的惯例会发生变化。这里y是这里最后一个维度相关的值(一般是最连续的那个)。 -
我添加了一个例子。是的,x 和 y 是倒置的。