如何计算二维NumPy数组的加权“中心”?

3

假设我有一些NumPy数组(在这种情况下它代表一个100x100的二进制图像)...

img=np.random.randint(0,2,(100,100)).astype(numpy.uint8)

如何最好地确定数组中1值的“平均位置”?例如,如果数组中有一组1,则希望找到该组的中心。

1个回答

1

我看到你也将此标记为numpy,所以我会这样做:

x = range(0, img.shape[0])
y = range(0, img.shape[1])

(X,Y) = np.meshgrid(x,y)

x_coord = (X*img).sum() / img.sum().astype("float")
y_coord = (Y*img).sum() / img.sum().astype("float")

那将为您提供加权平均中心。
如果您想要针对图像中每个1簇集进行此操作,建议使用连接组件来屏蔽您感兴趣的簇集。重复此过程可能不是一个好主意,而是在同一数组遍历中计算所有簇平均值。

5
scipy.ndimage 模块有一个 center_of_mass 函数,还有一个 label 函数用于查找聚类。 - Jaime
@Jaime:哦,那可能比我的解决方案更快。我会看一下的。谢谢你的提示! - Diana
1
如果您在调用np.meshgrid时设置sparse=True,并将img.sum()存储在辅助变量中以便重复使用而不是计算两次,我认为您的代码执行效率不会比Scipy差。我认为您也不需要.astype(float)这个操作,因为您正在除以numpy标量,而不是Python整数,但我可能错了... - Jaime

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接