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

时间:2017-04-05 09:23:44

标签: python numpy matplotlib scipy caffe

我正在尝试阅读lmdb dataset中的图片,对每个图片进行扩充,然后将其保存到另一个dataset中,以便在我的培训中使用。
这些图像轴在保存到(3,32,32)时最初更改为lmdb dataset,因此为了增强它们,我必须将它们转换回实际形状。
问题是每当我尝试使用matplotlib的{​​{1}}方法或show()的{​​{1}}方法显示它们时,它们都会显示图像的旋转版本。 所以我们有:

scipy

enter image description here

使用toimage()显示相同的图片:

enter image description here

现在如果我不转置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]) toimage的{​​{1}}会产生错误,而 data_train可以很好地显示图像:
enter image description here

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

1 个答案:

答案 0 :(得分: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)

使用imshow显示图像时,请注意以下缺陷:

  1. 它将图像视为矩阵,因此数组的尺寸被解释为(ROW,COLUMN,RGB),相当于(VERTICAL,HORIZONTAL,COLOR)或(Y,X,RGB)

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

  3. 示例:

    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)
    

    enter image description here

    请注意,较小的第一个维度对应于图像的垂直方向。