如何在不改变扭曲图像方向的情况下旋转扭曲网格?

信息处理 图像处理
2022-02-05 14:44:13

我有一个变形网格,必须应用于图像。当我应用网格时,我得到了我期望的结果。

现在,我想将相同的网格应用于相同的图像,但图像以以下方式修改:逆时针旋转 270 度。

网格作为点数组存储在内存中。它是 [-1, -1] - [1, 1] 归一化的。我正在尝试围绕原点旋转整个东西,即 [0, 0] id est 是图像的中心。另外,我正在尝试以 90 度的离散步长旋转。

P1 P2 P3 

P4 P5 P6

P7 P8 P9

这些是图像中点的目标坐标。例如,输入图像的右下角坐标为 [1,1]。在输出图像中,该点移动到 [P9.x, P9.y](也称为前向映射)。

我转置矩阵:

P1 P4 P7

P2 P5 P8

P3 P6 P9

然后我将转换应用于每一点

x = y'

y = -x',

其中 ' 表示旧坐标,缺少素数表示新坐标。我将派生网格应用于旋转

但是,我没有得到预期的扭曲。这项任务对我来说似乎非常简单,但我发现自己在第三天与这种奇怪的行为作斗争。有人可以指出我的错误或正确的程序吗?

2个回答

在二维中,要将一个点旋转某个角度,您需要将该点乘以如下形式的旋转矩阵:

[xy]=[cosθsinθsinθcosθ][xy]

在哪里(x,y)是旧坐标,(x,y)是新坐标,并且θ是您要应用的(逆时针)旋转角度。

因此,对于 270 度的旋转,您应用的矩阵是:

[xy]=[cos(270)sin(270)sin(270)cos(270)][xy]=[0110][xy]=[yx]

有一个关于旋转矩阵的综合维基百科页面,更详细地解释它们,将它们扩展到 3D,并总结它们的一些属性。

经过三天半的咒骂,和朋友喝了几杯啤酒帮助解决了这个问题。我的错误是点的重新排序不需要完全转置,而是关闭。所以:

要将网格逆时针旋转 90 度:

  • 转置网格并沿水平中心线反射
  • 应用转换

x = y'

y = -x',

其中素数表示旧坐标。

将网格旋转 180 度

  • 围绕水平轴和垂直轴反射网格
  • 应用转换

x = - x'

y = - y'

要将网格旋转 270 度

  • 转置网格并沿垂直中心线反射
  • 应用转换

x = - y'

y = x'