【问题标题】:Rotate an image about its centre on a GPU在 GPU 上围绕其中心旋转图像
【发布时间】:2017-05-11 08:20:26
【问题描述】:

假设图像 I 的维度为 (2, 2)。图形坐标 C 为:

C = [[0, 0], [1, 0],
     [0, 1], [1, 1]]

目标:将 I 绕中心(不是原点)旋转 90 度。

变换矩阵

TRotate(90) = [[0, 1], [-1, 0]]

(假设每个坐标对都可以同步转换(即在 GPU 上)。)

方法:

  1. 将图形坐标转换为以图像为中心的数学坐标。
  2. 应用变换矩阵。
  3. 转换回图形坐标。

例如:

转换为图形坐标:

tx' = tx - 宽度/2

ty' = ty - 宽度/2

C' =[[-1, -1], [0, -1],
     [-1, 0], [0, 0]]

应用变换矩阵:

C" = [[-1, 1], [-1, -0],
      [0, 1], [0, 0]]

转换回来:

C" = [[0, 2], [0, 1],
      [1, 2], [1, 1]]

返回的转换超出范围...

我真的在努力争取围绕“重心”工作的适当旋转。我认为我转换为“数学坐标”是错误的。

我宁愿将坐标转换为以下坐标,运气更好:

C' =[[-1, -1], [1, -1],
     [-1, 1], [1, 1]]

我通过观察如果原点存在于四个像素之间,+ve y 轴指向下方,+ve x 轴指向右侧,则实现了这种转换,那么点 (0,0) 将是 (-1, -1) 等等。 (由此产生的旋转和转换给出了预期的结果)。

但是,我找不到正确的变换类型来应用于坐标以将原点放置在中心。我尝试过使用齐次坐标的变换矩阵,但这不起作用。

编辑

马尔科姆的建议:

位置向量 =

[0
 0
 1]

通过减去 width/2 == 1 进行翻译:

[-1
 -1
 0]

通过乘以变换矩阵来旋转:

|-1|   | 0 1 0|   |-1|
|-1| X |-1 0 0| = | 1|
|0 |   | 0 0 1|   | 0|

【问题讨论】:

    标签: image-processing gpu graphical-programming


    【解决方案1】:

    您需要在矩阵中增加一行,用于 x 平移和 y 平移。然后在位置向量中添加一个额外的列,称为 w,它被硬编码为 1。这是确保可以使用标准矩阵乘法执行转换的技巧。

    由于您需要先平移,然后再进行旋转,因此您需要设置平移矩阵,然后乘以旋转矩阵(如果您对矩阵乘法不满意,则将它们都设为 3x3,最后一列将被忽略)。所以平移和旋转会相互交织。

    【讨论】:

    • 嗨马尔科姆。你的意思是位置向量中的额外行,所以 [x, y, w],w=1?你的意思是转换矩阵的额外列和行吗?
    • 您可以在列或行中考虑您的点,因此如果将其绘制为 [x y w] 它有列,如果垂直绘制它有行。只要矩阵使用反向(行匹配列,反之亦然),这并不重要。但是,如果矩阵是方形的,可能会更容易理解。
    • 谢谢,马尔科姆,但是结果很难转换回图形坐标。 [-1, 1, 0] 应该是图形坐标中的点 [0, 1]。
    • 所以你需要另一个翻译。矩阵是平移(中心到原点)* 旋转(关于原点)* 平移(原点到左上角)。 w 被硬编码为 1,而不是 0。
    • 如果我向后平移(原点到左上角),则该点变为 (0, 2) 超出范围。我真的很难受。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-05-19
    • 2011-07-08
    • 2018-04-26
    • 1970-01-01
    • 2020-05-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多