一种解决方案,无需使用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 的基于旋转的函数所做的那样。