我有一个形状(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