2017-04-05 26 views
2

lmdbdatasetから画像を読み取ろうとしていますが、それぞれを増補して、別のdatasetに保存して、トレーニングに使用しています。
これらの画像軸は、最初にlmdb datasetに保存されたときに(3,32,32)に変更されました。そのため、それらを拡大するために、それらを実際の形状に戻す必要がありました。
問題は、matplotlibshow()メソッドまたはscipytoimage()メソッドを使用して表示しようとするたびに、画像の回転バージョンが表示されます。 だから我々は持っている:なぜnumpy配列を転置すると90度回転しますか?

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

enter image description here

enter image description here

私はdata_trainを転置いけない場合さて、pyplotshow()toimage()中にエラーが発生し画像がうまく表示されます:
enter image description here

ここで何が起こっているか
転置されたdata_trainを私のオグメンタにフィードすると、前の例のように結果が回転します。
これは表示の問題か実際の画像が実際に回転しているかわかりません。
どうすればよいですか?

答えて

6

まず、よく見てください。転置アレイは回転されずに対角線上にミラーリングされる(すなわち、XおよびY軸は入れ替えられる)。

元の形状は(3,32,32)です。これは(RGB, X, Y)と解釈されます。ただし、imshowは、形状の配列がMxNx3であることを想定しています。色情報は最後の次元にある必要があります。

配列を転置すると、次元の順序が逆になります。(RGB, X, Y)(Y, X, RGB)になります。色情報が最後の次元にあるが、XとYも入れ替えられているので、これはmatplotlibにとっては問題ありません。あなたは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. それは扱い(垂直、水平、色)または(Y、X、RGB)に相当する(ROW、COLUMN、RGB)として解釈されます。

  2. 左上隅がimg [0、0]になるようにy軸の方向を変更します。これは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

関連する問題