为什么移调一个numpy数组会将其旋转90度?

Rik*_*ika 3 python numpy matplotlib scipy caffe

我试图从a中读取图像,对lmdb dataset每个图像进行扩充,然后将它们保存到另一个图像中,dataset以便在我的训练中使用.
这些图像轴最初被改为(3,32,32)当它们被保存到时lmdb dataset,所以为了增强它们,我必须将它们转换回它们的实际形状.
问题是,每当我尝试使用既可以显示它们matplotlibshow()方法或scipytoimage(),它们显示图像的旋转版本.所以我们有:

img_set = np.transpose(data_train,(0,3,2,1))
#trying to display an image using pyplot, makes it look like this:  
plt.subplot(1,2,1)
plt.imshow(img_set[0])
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

显示相同的图像使用toimage:

在此输入图像描述

现在,如果我不转data_train,pyplotshow()生成错误而 toimage()显示图像良好:
在此输入图像描述

这里发生了什么?
当我将转置的data_train提供给我的增强器时,我也像前面的例子一样旋转结果.
现在我不确定这是否是一个显示问题,或者实际图像确实是旋转的!
我该怎么办 ?

kaz*_*ase 8

首先,仔细看看.transoposed阵列不旋转但在对角线上镜像(即交换X轴和Y轴).

原始形状(3,32,32),我解释为(RGB, X, Y).但是,imshow需要一个形状数组MxNx3- 颜色信息必须在最后一个维度中.

通过转置数组,您可以反转维度的顺序:(RGB, X, Y)变为(Y, X, RGB).这对于matplotlib来说很好,因为颜色信息现在在最后一个维度,但X和Y也是交换的.如果你想保留X,Y的顺序你可以告诉transpose to do so:

import numpy as np

img = np.zeros((3, 32, 64))  # non-square image for illustration

print(img.shape)  # (3, 32, 64)
print(np.transpose(img).shape)  # (64, 32, 3)
print(np.transpose(img, [1, 2, 0]).shape)  # (32, 64, 3)
Run Code Online (Sandbox Code Playgroud)

当使用imshow以显示图像注意以下陷阱:

  1. 它将图像视为矩阵,因此数组的尺寸被解释为(ROW,COLUMN,RGB),它等效于(垂直,水平,颜色)或(Y,X,RGB).

  2. 它改变了y轴的方向,所以左上角是img [0,0].这与matplotlib的常规坐标系不同,其中(0,0)是左下角.

例:

import matplotlib.pyplot as plt

img = np.zeros((32, 64, 3))
img[1, 1] = [1, 1, 1]  # marking the upper right corner white

plt.imshow(img)
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

注意,较小的第一维对应于图像的垂直方向.