2017-05-09 113 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