提问者:小点点

使用numpy对2组加窗的图像之间的误差进行逐像素矢量化计算


我正试图计算2个窗口图像集之间的误差逐像素(每个图像)。为此,我将原始img减去编码img的值。之后,我想计算每个像素到0的距离(使用RGB图像的3维)。我现在搜索的结果是一个与原始数据形状相同但只有一维的新矩阵(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定义要计算范数的轴。

例如,这里是第一个窗口的第一个图像的第一个三通道像素的范数:

np.linalg.norm(diff_matrix[:1, :1, :1, :1], axis=4)

因此,您可以将<code>l2_matrix</code>定义为:

l2_matrix = np.linalg.norm(diff_matrix, axis=4)

其作为< code>n_windows_max,n_imgs_window_max,x_max,y_max的维度。

如果你最终需要额外的维度,你可以:

l2_matrix.reshape(*l2_matrix.shape, 1)