[英]Why does transposing a numpy array rotate it 90 degrees?
我正在尝试从lmdb
dataset
读取图像,对每个图像进行扩充,然后将它们保存到另一个dataset
以便在我的培训中使用。
这些图像轴在被保存到lmdb dataset
时最初被更改为(3,32,32)
,因此为了增强它们,我必须将它们转换回它们的实际形状。
问题是每当我尝试使用matplotlib
的show()
方法或scipy
的toimage()
显示它们时,它们都会显示图像的旋转版本。 所以我们有:
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
, pyplot
的show()
生成错误,而toimage()
会很好地显示图像:
这里发生了什么?
当我将转置的data_train提供给我的增强器时,我也像前面的例子一样旋转结果。
现在我不确定这是否是一个显示问题,或者实际图像确实是旋转的!
我该怎么办 ?
首先,仔细看看。 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
显示图像时,请注意以下陷阱:
它将图像视为矩阵,因此数组的尺寸被解释为(ROW,COLUMN,RGB),相当于(垂直,水平,颜色)或(Y,X,RGB)。
它改变了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)
注意,较小的第一维对应于图像的垂直方向。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.