Как вычислить центр масс многих изображений без за l oop? - PullRequest
0 голосов
/ 13 апреля 2020

У меня есть 100 изображений размером 10 x 10. Я хочу поместить их в один массив формы 100 x 10 x 10, а затем вычислить центр масс 100 изображений в одном go (без всех oop for).

В настоящее время я использую функцию 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,:]) )

Есть ли способ удалить это для l oop?

Ответы [ 2 ]

1 голос
/ 13 апреля 2020

Используйте видоизмененную матрицу и точечное произведение. Например:

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
1 голос
/ 13 апреля 2020

Вы можете использовать аргументы labels и index для функции center_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
...