为什么转置NumPy数组会将其旋转90度?

3

我正在尝试从一个lmdb数据集中读取图像,对每个图像进行增强,然后将它们保存到另一个数据集中以供我的训练使用。
当这些图像被保存到lmdb数据集中时,它们的轴最初被更改为(3,32,32),因此为了增强它们,我必须将它们转置回其实际形状。
问题是,每当我尝试使用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])

输入图像描述

使用 toimage 显示同一张图片:

输入图像描述

现在,如果我不对 data_train 进行转置,pyplotshow() 会生成一个错误,而 toimage() 则正常显示图片:
输入图像描述

这是怎么回事呢?
当我将转置后的数据集 data_train 输入至增强器时,得到的结果与之前的例子一样旋转了。
现在我不确定这是一个显示问题,还是实际上图像确实是旋转了!
我该怎么办?

1个回答

10

首先,仔细观察。转置后的数组没有旋转,而是沿对角线镜像翻转(即X和Y轴互换)。

原始形状为(3,32,32),我将其解释为(RGB,X,Y)。然而,imshow需要一个形状为MxNx3的数组,颜色信息必须在最后一个维度中。

通过转置数组,您可以反转维度的顺序:(RGB,X,Y)变为(Y,X,RGB)。对于matplotlib来说这没问题,因为现在颜色信息在最后一个维度中,但是X和Y也被交换了。如果您想保留X和Y的顺序,可以告诉transpose这样做:

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. 它将图像视为矩阵,因此数组的尺寸被解释为 (行, 列, 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)

输入图像描述

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


非常感谢,解释得非常好 ;) - Hossein

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接