如何在没有for循环的情况下计算许多图像的质心?

时间:2020-04-13 02:11:10

标签: python loops image-processing scipy average

我有100张10 x 10的图像,我想将它们放在形状为100 x 10 x 10的单个数组中,然后一次性计算100张图像的质心(无循环)。 / p>

当前,我正在使用center_of_mass中的函数scipy,如下所示:

import numpy as np
from scipy.ndimage.measurements import center_of_mass

# Example data
image = np.arange(100).reshape(10,10)
images = np.repeat([image],100, axis=0)

result = []
for i in range(images.shape[0]): 
    result.append( center_of_mass(images[i,:]) )

是否可以删除for循环?

2 个答案:

答案 0 :(得分:1)

您可以对labels函数使用indexcenter_of_mass参数(每个图像一个标签)。缺点是内存使用率大约翻了一番。

labels = np.ones_like(images).cumsum(0)
result2 = [tup[1:] for tup in
           center_of_mass(images, labels, index=np.arange(1, images.shape[0]+1))
]

assert result2 == result

答案 1 :(得分:1)

使用重塑矩阵和点积。 例如:

import numpy as np
# Example data
image = np.arange(80).reshape(8,10)
images = np.repeat([image],90, axis=0)
images_row=images.reshape((90, 8*10))
S=np.sum(images_row, axis=1)
Y_mat,X_mat = np.meshgrid(np.arange(10),np.arange(8))

Y_mats = np.repeat([Y_mat],90, axis=0)
Y_mats = Y_mats.reshape((90, 8*10))

X_mats= np.repeat([X_mat],90, axis=0)
X_mats = X_mats.reshape((90, 8*10))

#center of mass:
X_c=np.dot(images_row, X_mats.T)/S
Y_c=np.dot(images_row, Y_mats.T)/S