我有一個形狀(7,4,100,100)的numpy陣列,這意味着我有7個深度爲4的100x100的圖像。我想旋轉90度的這些圖像。 我曾嘗試:爲多維NumPy陣列旋轉90度的圖像
rotated= numpy.rot90(array, 1)
但是它改變了陣列的形狀(4,7,100,100),其是不希望的。任何解決方案?
我有一個形狀(7,4,100,100)的numpy陣列,這意味着我有7個深度爲4的100x100的圖像。我想旋轉90度的這些圖像。 我曾嘗試:爲多維NumPy陣列旋轉90度的圖像
rotated= numpy.rot90(array, 1)
但是它改變了陣列的形狀(4,7,100,100),其是不希望的。任何解決方案?
而不使用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.dot
或swapping axes
基於那些在性能方面也更顯得不錯重要的是不要執行任何會改變值的插值,否則就像Scipy基於旋轉的函數所做的那樣。
This Works!非常感謝。 –
如何使用swapaxes在180度旋轉? –
@FJ_Abbasi使用'out = img [...,:: - 1,:: - 1]'。 – Divakar
你可以使用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)
如果你注意旋轉的圖像,你會在左邊看到一個黑色邊框,這是因爲Scipy使用插值。所以,實際上圖像已經改變了。但是,如果這對您來說是個問題,則有許多選項可以刪除黑色邊框。
請參閱post。
對不起,這是rot90()..我編輯了這個問題。另外,我嘗試過numpy.rot90(array,(2,3)),但它給出了: TypeError:不受支持的操作數類型爲%:'tuple'和'int' –
您已經更正了我的答案,然而,因爲它看起來像你喜歡downvoting人試圖幫助你,我刪除了我的答案。找到其他想幫助你的人! @Divakar你也可以刪除你的答案嗎? –
@SembeiNorimaki不要以爲OP已經降低了投票率。 OP的個人資料顯示沒有投票。 – Divakar