#python #image #numpy #vectorization
#python #изображение #numpy #векторизация
Вопрос:
Я пытаюсь вычислить ошибку между 2 оконными наборами изображений попиксельно (каждого изображения). Для этого я вычитаю значение кодифицированного img из исходного img. После этого я хочу вычислить расстояние от каждого пикселя до 0 (используя 3 измерения изображения RGB). Результатом, который я ищу прямо сейчас, является новая матрица с той же формой, что и исходные данные, но только с 1 измерением (l2_matrix).
Код, который я использую для этого:
n_windows_max, n_imgs_window_max, x_max, y_max, n_dim = diff_matrix.shape
l2_matrix = np.zeros((n_windows_max,n_imgs_window_max,x_max, y_max, 1))
n_window = 0
n_img_window = 0
x_i = 0
y_i = 0
for n_window in range(n_windows_max): # read each window
for n_img_window in range(n_imgs_window_max): #read all the images of each window
for x_i in range(x_max):
for y_i in range(y_max):
a0 = diff_matrix[n_window, n_img_window, x_i, y_i, 0]
a1 = diff_matrix[n_window, n_img_window, x_i, y_i, 1]
a2 = diff_matrix[n_window, n_img_window, x_i, y_i, 2]
a = array([a0, a1, a2])
l2_matrix[n_window, n_img_window, x_i, y_i, 0] = norm(a)
Как вы можете видеть, у меня есть 5-мерная матрица, где форма: (количество окон, количество изображений в каждом окне, ось x, ось y, номер измерения). Приведенный выше код работает нормально, но я хочу его улучшить.Я пытался векторизовать его, но я не знаю, как это сделать правильно (я прочитал несколько сообщений с примерами того, как это сделать, но это было для более простых целей, и я не смог экстраполировать его на эту проблему).
Ответ №1:
Вы можете определить ось, по которой вы хотите рассчитать норму np.linalg.norm
.
Например, здесь норма первого трехканального пикселя 1-го изображения 1-го окна:
np.linalg.norm(diff_matrix[:1, :1, :1, :1], axis=4)
Таким образом, вы можете просто определить l2_matrix
как:
l2_matrix = np.linalg.norm(diff_matrix, axis=4)
Который как измерение n_windows_max, n_imgs_window_max, x_max, y_max
.
И если вам нужно это дополнительное измерение в конце, вы можете сделать:
l2_matrix.reshape(*l2_matrix.shape, 1)