【问题标题】:Rotate a 2D image around specified origin in Python在 Python 中围绕指定原点旋转 2D 图像
【发布时间】:2014-10-16 23:34:22
【问题描述】:

我有一个 512x512 像素的 2D 图像,我想在某个原点(旋转中心)以某个角度旋转它。一直以来,我都使用 Scipy 使用它的 rotate 方法来旋转图像。但是,我被绊倒了,因为旋转总是围绕图像的中心进行。对于 512x512 像素,旋转中心应围绕点 (x,y) 128,128。如何使用自定义旋转中心旋转图像,比如 (x,y) 20,128?

【问题讨论】:

  • 如果OpenCV可用,你会找到解决方案here

标签: python image numpy rotation scipy


【解决方案1】:

如果 OpenCV 不是一个选项,您可以通过以下方式使用 NumPy (import numpy as np) 和 SciPy (from scipy import ndimage) 围绕所谓的枢轴点进行图像旋转:

  1. 填充图像img,使轴心点位于图像中心并且图像大小加倍:

    padX = [img.shape[1] - pivot[0], pivot[0]]
    padY = [img.shape[0] - pivot[1], pivot[1]]
    imgP = np.pad(img, [padY, padX], 'constant')
    

    (虽然图像形状是行列顺序,pivot 在这里是 X-Y 或列行顺序。您可能需要不同的定义。)

  2. 围绕中心旋转图像(此处旋转角度为 45 度):

    imgR = ndimage.rotate(imgP, 45, reshape=False)
    

    请注意,我们不允许重塑图像,因为我们会自己裁剪图像。

  3. 裁剪图像,使枢轴点位于其原始位置。因此,我们只需将步骤 1 中的填充反转:

    imgC = imgR[padY[0] : -padY[1], padX[0] : -padX[1]]
    

您可以在下图中看到不同的步骤(原始图像、填充、旋转、裁剪;围绕 (100, 300) 旋转 45 度)。

将其包装在一个方便的函数中会产生:

def rotateImage(img, angle, pivot):
    padX = [img.shape[1] - pivot[0], pivot[0]]
    padY = [img.shape[0] - pivot[1], pivot[1]]
    imgP = np.pad(img, [padY, padX], 'constant')
    imgR = ndimage.rotate(imgP, angle, reshape=False)
    return imgR[padY[0] : -padY[1], padX[0] : -padX[1]]

更新

对于彩色图像,您必须避免在填充时添加更多通道(第三维中的零填充):

imgP = np.pad(img, [padY, padX, [0, 0]], 'constant')

不要忘记为“之前”和“之后”填充使用0。否则你会得到一个ValueError

【讨论】:

  • 我尝试了这段代码,但在我尝试过的所有图像上都得到了 ValueError: "Unable to create correct shape tuple"。这是因为它们是彩色的,而 lena 是黑白的吗?
  • @FightFireWithFire:我可以重现您的错误并相应地编辑我的答案。
猜你喜欢
  • 1970-01-01
  • 2023-04-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-02-20
  • 1970-01-01
相关资源
最近更新 更多