在GPU

时间:2017-05-11 08:20:27

标签: image-processing gpu-programming graphical-programming

假设尺寸为(2,2)的图像I.图形坐标C如下:

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

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

转化矩阵

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

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

方法:

  1. 将图形坐标转换为数学坐标,并将原点作为图像的中心。
  2. 应用转换矩阵。
  3. 转换回图形坐标。
  4. 例如:

    转换为图形坐标:

    TX' = tx - width / 2

    TY' = ty - width / 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轴指向下,+ 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|
    

1 个答案:

答案 0 :(得分:1)

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

由于你需要一个平移后跟一个旋转,你需要设置平移矩阵,然后通过旋转矩阵进行乘法(如果你在矩阵乘法上不稳定,则将它们都放在3x3s中,忽略最后一列)。因此,翻译和轮换将相互交织。