将多维 NumPy 数组的图像旋转 90 度

2024-03-07

我有一个形状为 (7,4,100,100) 的 numpy 数组,这意味着我有 7 个 100x100、深度为 4 的图像。我想将这些图像旋转 90 度。 我努力了:

rotated= numpy.rot90(array, 1)

但它将数组的形状更改为 (4,7,100,100),这是不需要的。有什么解决办法吗?


一种解决方案,无需使用np.rot90顺时针方向旋转就是交换最后两个轴,然后翻转最后一个轴 -

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

对于逆时针旋转,翻转倒数第二个轴 -

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

With 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 or swapping axes基于旋转的函数在性能方面似乎相当不错,而且更重要的是,不执行任何会改变值的插值,否则就像 Scipy 的基于旋转的函数所做的那样。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

将多维 NumPy 数组的图像旋转 90 度 的相关文章

随机推荐