【问题标题】:Rotating images by 90 degrees for a multidimensional NumPy array将多维 NumPy 数组的图像旋转 90 度
【发布时间】:2017-10-07 11:19:28
【问题描述】:

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

rotated= numpy.rot90(array, 1)

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

【问题讨论】:

  • 对不起,它是 rot90().. 我已经编辑了这个问题。另外我试过 numpy.rot90(array,(2,3)) 但它给出:TypeError: unsupported operand type(s) for %: 'tuple' and 'int'
  • 您对我的答案进行了更正、解释和工作,但是因为看起来您喜欢对试图帮助您的人投反对票,所以我删除了我的答案。找一个愿意帮助你的人! @Divakar 你也可以删除你的答案吗?
  • @SembeiNorimaki 不要认为 OP 投了反对票。 OP 的个人资料显示没有投票。
  • @SembeiNorimaki 我没有对你的答案投反对票!
  • 我要求向投反对票的人作出解释,而您说答案不能作为对我问题的答复。

标签: python image numpy


【解决方案1】:

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

【讨论】:

  • 如何使用交换轴旋转 180 度?
  • @FJ_Abbasi 使用out = img[...,::-1,::-1]
【解决方案2】:

另一种选择

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

【讨论】:

  • 感谢工作的人!我的问题的解决方案:rotate_img= rotate(array, 90, axes=(2,3))
  • @FahadJahangir 我很高兴能帮上忙 :)
  • @FahadJahangir 当心这会进行插值。因此,值将被更改,并且左侧也会有一条黑线。尝试使用img = np.random.randint(0,255,(3,5)),然后使用rot1 = rotate(img, 90),然后查看imgrot1。致 Manel - 为了 OP 和未来的读者,这可能值得在帖子中提及。
  • 仅供参考,对于 90/180/270 次旋转和翻转,计算成本要高得多
【解决方案3】:

逆时针旋转 3 次:np.rot90(image, 3)。

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

【讨论】:

    猜你喜欢
    • 2011-06-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-27
    • 1970-01-01
    • 2020-07-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多