当前位置: 首页 > 面试题库 >

在Python中围绕指定的原点旋转2D图像

相高谊
2023-03-14
问题内容

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


问题答案:

如果不能使用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此处的图像形状按行-列顺序,但按XY或列-行顺序。您可能需要不同地定义它。)

  1. 围绕图像中心旋转图像(此处旋转角度为45度):
    imgR = ndimage.rotate(imgP, 45, reshape=False)
    

请注意,由于我们将自己裁剪图像,因此不允许重塑图像。

  1. 裁剪图像,使枢轴点位于其原始位置。因此,我们只需将步骤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]]

更新资料

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

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

不要忘记对0“ before”和“ after”填充都使用a 。否则你会得到一个ValueError



 类似资料:
  • 当我尝试使用旋转图像视图时,我现在开始学习JavaFX 它绕着它的中轴线旋转,但是当我尝试使用 它随机旋转,我不知道它的旋转轴是一样的

  • 我目前正在尝试绕世界x轴旋转一个位置向量(0,0,1),然后将其旋转回其原始位置(只是尝试使其工作)。我阅读了旋转矩阵,并使它工作(排序),但我现在相当卡住了。 如图和代码所示,我在起点(0,0,1)处创建了一个立方体,并将其向下旋转30度。但顺时针旋转时,它的旋转角度似乎超过30度。但是,当我逆时针(30度)旋转它时,它确实旋转了适当的量。这导致它没有在它应该(0,0,1)的起点处结束。 我想知

  • 问题内容: 有没有一种简单的方法可以围绕图片中心旋转图片?我首先使用了AffineTransformOp。看起来很简单,而且需要,并且在一个整洁的Google会话中为矩阵找到正确的参数。所以我认为… 我的结果是这样的: 如果您忽略旋转90度的倍数的情况,这非常简单(sin()和cos()无法正确处理)。该解决方案的问题在于,它围绕图片左上角的(0,0)坐标点进行变换,而不是围绕图片中心进行正常的变

  • 现在我想把sprite的位置相应地放在我旋转的身体上。在这里我所做的 这是我怎么画的 当我运行我的代码时会发生奇怪的事情。我看到主体正确旋转,但是由于这一行所以sprite的位置始终与主体位置相同。我该怎么做呢?

  • 问题内容: 我已经在这个问题上进行了很多搜索,但是我找不到真正合适的答案。 我需要围绕给定点(例如0,0,0)旋转圆柱体,但是默认情况下会给出圆柱体的枢轴。我该如何改变? 为了更好地说明我想做什么,我将显示3张图像。 imageshack.us/photo/my-images/259/aintgood.jpg imageshack.us/photo/my-images/840/whatineed.

  • 问题内容: 将转盘旋转到半圆形(北半球)图像的顶部作为背景。范围可以是0-180度。输入进行画布转换的方法时,刻度盘将旋转并停在匹配的值上。这是我根据phrogz传递的帮助和示例进行的尝试 问题答案: 通常,您要执行的操作是: 将上下文转换为画布上对象应旋转的点。 旋转上下文。 通过对象内旋转中心的负偏移来转换上下文。 在0,0处绘制对象。 在代码中: 这是一个实际的示例,展示了这一点。(旋转的数