2017-05-09 826 views
4

我有一個形狀(7,4,100,100)的numpy陣列,這意味着我有7個深度爲4的100x100的圖像。我想旋轉90度的這些圖像。 我曾嘗試:爲多維NumPy陣列旋轉90度的圖像

rotated= numpy.rot90(array, 1) 

但是它改變了陣列的形狀(4,7,100,100),其是不希望的。任何解決方案?

+0

對不起,這是rot90()..我編輯了這個問題。另外,我嘗試過numpy.rot90(array,(2,3)),但它給出了: TypeError:不受支持的操作數類型爲%:'tuple'和'int' –

+0

您已經更正了我的答案,然而,因爲它看起來像你喜歡downvoting人試圖幫助你,我刪除了我的答案。找到其他想幫助你的人! @Divakar你也可以刪除你的答案嗎? –

+0

@SembeiNorimaki不要以爲OP已經降低了投票率。 OP的個人資料顯示沒有投票。 – Divakar

回答

1

而不使用np.rot90在沿順時針方向旋轉。將交換的最後兩個軸,然後翻轉最後一個的一種解決方案 -

img.swapaxes(-2,-1)[...,::-1] 

對於逆時針旋轉,翻轉的倒數第二個軸 -

img.swapaxes(-2,-1)[...,::-1,:] 

隨着np.rot90,逆時針旋轉將是 -

np.rot90(img,axes=(-2,-1)) 

採樣運行 -

In [39]: img = np.random.randint(0,255,(7,4,3,5)) 

In [40]: out_CW = img.swapaxes(-2,-1)[...,::-1] # Clockwise 

In [41]: out_CCW = img.swapaxes(-2,-1)[...,::-1,:] # Counter-Clockwise 

In [42]: img[0,0,:,:] 
Out[42]: 
array([[142, 181, 141, 81, 42], 
     [ 1, 126, 145, 242, 118], 
     [112, 115, 128, 0, 151]]) 

In [43]: out_CW[0,0,:,:] 
Out[43]: 
array([[112, 1, 142], 
     [115, 126, 181], 
     [128, 145, 141], 
     [ 0, 242, 81], 
     [151, 118, 42]]) 

In [44]: out_CCW[0,0,:,:] 
Out[44]: 
array([[ 42, 118, 151], 
     [ 81, 242, 0], 
     [141, 145, 128], 
     [181, 126, 115], 
     [142, 1, 112]]) 

運行測試

In [41]: img = np.random.randint(0,255,(800,600)) 

# @Manel Fornos's Scipy based rotate func 
In [42]: %timeit rotate(img, 90) 
10 loops, best of 3: 60.8 ms per loop 

In [43]: %timeit np.rot90(img,axes=(-2,-1)) 
100000 loops, best of 3: 4.19 µs per loop 

In [44]: %timeit img.swapaxes(-2,-1)[...,::-1,:] 
1000000 loops, best of 3: 480 ns per loop 

因此,對於由90度或它的整數倍旋轉,numpy.dotswapping axes基於那些在性能方面也更顯得不錯重要的是不要執行任何會改變值的插值,否則就像Scipy基於旋轉的函數所做的那樣。

+0

This Works!非常感謝。 –

+0

如何使用swapaxes在180度旋轉? –

+0

@FJ_Abbasi使用'out = img [...,:: - 1,:: - 1]'。 – Divakar

2

另一種選擇

你可以使用scipy.ndimage.rotate,我認爲這是比numpy.rot90

例如更加有用,

from scipy.ndimage import rotate 
from scipy.misc import imread, imshow 

img = imread('raven.jpg') 

rotate_img = rotate(img, 90) 

imshow(rotate_img) 

enter image description here enter image description here

更新(帶內插當心)

如果你注意旋轉的圖像,你會在左邊看到一個黑色邊框,這是因爲Scipy使用插值。所以,實際上圖像已經改變了。但是,如果這對您來說是個問題,則有許多選項可以刪除黑色邊框。

請參閱post

+0

謝謝你的作品!我的問題的解決方案: rotate_img = rotate(array,90,axes =(2,3)) –

+0

@FahadJahangir我很高興我能夠幫助:) – manelfp

+1

@FahadJahangir當心這是插值。所以,這些值會被改變,而且左邊會有一條黑線。用'img = np.random.randint(0,255,(3,5))'然後'rot1 = rotate(img,90)'來查看'img'和'rot1'。 To Manel - 這可能值得在這篇文章中爲OP和未來的讀者帶來好處。 – Divakar