Векторизировать вычисление ошибки между 2 оконными наборами изображений попиксельно с помощью numpy

#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)