2017-04-05 133 views
2

我試圖從lmdbdataset中讀取圖像,對每個圖像進行增強,然後將它們保存到另一個dataset中,以便在我的培訓中使用。
這些圖像軸在保存到lmdb dataset時最初更改爲(3,32,32),所以爲了增強它們,我必須將它們轉換回它們的實際形狀。
問題是每當我嘗試使用matplotlibshow()方法或scipytoimage()顯示它們時,它們都會顯示圖像的旋轉版本。 因此,我們有:爲什麼轉置一個numpy數組將它旋轉90度?

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]) 

enter image description here

顯示使用toimage相同的圖像:現在

enter image description here

,如果我不轉data_trainpyplotshow()產生而 toimage()錯誤很好地顯示圖像:
enter image description here

這裏發生了什麼?
當我將轉置的data_train提供給我的擴展器時,我也會像前面的示例一樣獲得旋轉的結果。
現在我不確定這是一個顯示問題,還是實際的圖像確實旋轉了!
我該怎麼辦?

回答

6

首先,仔細觀察。被轉移的陣列不旋轉,而是在對角線上鏡像(即交換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),這等同於(垂直,水平,顏色)或(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) 

enter image description here

注意,較小的第一維對應於圖像的垂直方向。

+0

非常感謝,非常好的解釋;) – Breeze