我有一个形状为(7,4,100,100)的numpy数组,这意味着我有7张深度为4的100x100图像。我想将这些图像旋转90度。
我已经尝试过:
rotated= numpy.rot90(array, 1)
但它会改变数组的形状为(4,7,100,100),这并不是所期望的结果。有什么解决方案吗?
我有一个形状为(7,4,100,100)的numpy数组,这意味着我有7张深度为4的100x100图像。我想将这些图像旋转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 的旋转函数一样改变值。
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使用了内插法。所以,实际上图像已经被改变了。然而,如果这对你是个问题,那么有许多选项可以去除黑色边框。
请看这个帖子。
img = np.random.randint(0,255,(3,5))
,然后 rot1 = rotate(img, 90)
,查看 img
和 rot1
。对于Manel-这可能值得在帖子中提及,以使OP和未来的读者受益。 - Divakar逆时针旋转三次:np.rot90(image, 3)。
如果实现已经优化,并且我们在这里指定的是90度的增量而不是循环计数器,那么它可能会慢三倍,也可能不会。