Image processing 在GPU上围绕图像中心旋转图像
假设图像I的尺寸为2,2。图形坐标C如下所示:Image processing 在GPU上围绕图像中心旋转图像,image-processing,gpu,graphical-programming,Image Processing,Gpu,Graphical Programming,假设图像I的尺寸为2,2。图形坐标C如下所示: C = [[0, 0], [1, 0], [0, 1], [1, 1]] 目标:围绕中心而非原点旋转I 90度 变换矩阵: TRotate90=[[0,1],-1,0]] 假设每个坐标对可以在锁步中转换,即在GPU上 方法: 将图形坐标转换为以原点为图像中心的数学坐标。 应用变换矩阵。 转换回图形坐标。 例如: 转换为图形坐标: tx'=tx-宽度/2 C' =[[-1, -1], [0, -1], [-1, 0], [0,
C = [[0, 0], [1, 0],
[0, 1], [1, 1]]
目标:围绕中心而非原点旋转I 90度
变换矩阵:
TRotate90=[[0,1],-1,0]]
假设每个坐标对可以在锁步中转换,即在GPU上
方法:
将图形坐标转换为以原点为图像中心的数学坐标。
应用变换矩阵。
转换回图形坐标。
例如:
转换为图形坐标:
tx'=tx-宽度/2
C' =[[-1, -1], [0, -1],
[-1, 0], [0, 0]]
ty'=ty-宽度/2
C' =[[-1, -1], [0, -1],
[-1, 0], [0, 0]]
应用转换矩阵:
C" = [[-1, 1], [-1, -0],
[0, 1], [0, 0]]
|-1| | 0 1 0| |-1|
|-1| X |-1 0 0| = | 1|
|0 | | 0 0 1| | 0|
转换回:
C" = [[0, 2], [0, 1],
[1, 2], [1, 1]]
转换回已超出范围
我真的在努力让“重心”正确旋转。我认为我对“数学坐标”的转换是错误的
我更幸运的是将坐标转换为以下值:
C' =[[-1, -1], [1, -1],
[-1, 1], [1, 1]]
通过观察,我实现了这个转换,如果原点位于四个像素之间,+vey轴向下,+vex轴向右,那么点0,0将是-1,-1,以此类推。由此产生的旋转和转换将得到所需的结果
但是,我找不到合适的变换来应用于坐标,从而将原点放置在中心。我尝试过使用齐次坐标的变换矩阵,但这不起作用
编辑
马尔科姆建议:
位置向量=
[0
0
1]
通过减去宽度进行平移/2==1:
[-1
-1
0]
通过乘以变换矩阵进行旋转:
C" = [[-1, 1], [-1, -0],
[0, 1], [0, 0]]
|-1| | 0 1 0| |-1|
|-1| X |-1 0 0| = | 1|
|0 | | 0 0 1| | 0|
您需要在矩阵中增加一行,以便按x和y进行转换。然后向位置向量添加一个额外的列,称之为w,硬编码为1。这是一个确保可以使用标准矩阵乘法执行转换的技巧
由于需要先进行平移,然后进行旋转,因此需要设置平移矩阵,然后对旋转矩阵进行乘法,使它们都为3x3,如果矩阵乘法不稳定,则忽略最后一列。因此,平移和旋转将相互交织。Hi Malcom。你的意思是在位置向量中有一个额外的行,所以[x,y,w],w=1?你的意思是在转换矩阵中增加一列和一行吗?你可以把你的点想象成列或行,所以如果你把它画成[x y w],它有列,如果你垂直画它,它有行。只要矩阵使用相反的行匹配列,反之亦然,这并不重要。不过,如果矩阵是正方形的,这可能会更容易理解。多亏了马尔科姆,结果很难转换回图形坐标。[-1,1,0]应该是图形坐标系中的点[0,1],因此需要另一个平移。矩阵为平移中心到原点*围绕原点旋转*平移原点到左上角。w被硬编码为1,而不是0。如果我将原点向后平移到左上角,点变成0,2超出边界。我真的很为难。