簡體   English   中英

為什么移調一個numpy數組會將其旋轉90度?

[英]Why does transposing a numpy array rotate it 90 degrees?

我正在嘗試從lmdb dataset讀取圖像,對每個圖像進行擴充,然后將它們保存到另一個dataset以便在我的培訓中使用。
這些圖像軸在被保存到lmdb dataset時最初被更改為(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_trainpyplotshow()生成錯誤,而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顯示圖像時,請注意以下陷阱:

  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)

在此輸入圖像描述

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM