对于多维NumPy阵列,将图像旋转90度

时间:2017-05-09 08:30:45

标签: python image numpy

我有一个numpy形状阵列(7,4,100,100),这意味着我有7张100x100深度为4的图像。我想将这些图像旋转90度。 我试过了:

rotated= numpy.rot90(array, 1)

但它将阵列的形状改变为(4,7,100,100),这是不希望的。有什么解决方案吗?

3 个答案:

答案 0 :(得分:4)

另一个选项

您可以使用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

答案 1 :(得分:2)

不使用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的基于旋转的功能完成。

答案 2 :(得分:1)

逆时针旋转三圈:np.rot90(image, 3).

它可能慢三倍,如果实现实际上是优化的并且我们在这里以 90 增量指定角度,而不是循环计数器,则可能不会。