[英]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.