PyTorch affine_grid中仿射变换的执行顺序:先平移还是先旋转?
PyTorch affine_grid 变换顺序说明
affine_grid的核心逻辑是逆变换采样——你写的2x3仿射矩阵,是用来计算「输出图像的每个像素,对应输入图像的哪个位置」,而不是直接对输入图像执行正向变换。
你预期的是“输入图像先旋转,再平移”得到输出,但实际看到的是“先平移再旋转”的效果,问题就出在正变换和逆变换的顺序相反:
- 正变换流程(你想要的效果):输入 → 旋转 → 平移 → 输出
- 采样时的逆变换流程(
affine_grid实际做的):输出像素需要从「输入先做平移的逆操作,再做旋转的逆操作」的位置取像素,最终视觉上就呈现出“先平移再旋转”的结果。
要实现你预期的“先旋转再平移”效果,需要构造正变换的逆矩阵传入affine_grid,步骤如下:
- 把平移量取反(原来的
(-0.5,0)变成(0.5,0)),得到逆平移参数 - 把旋转角度取反(30度变成-30度),得到逆旋转矩阵
- 组合成最终的2x3仿射矩阵
示例代码:
import torch import math theta = math.radians(30) # 正变换的旋转参数 cos_theta, sin_theta = math.cos(theta), math.sin(theta) # 正变换的平移量 tx, ty = -0.5, 0 # 构造逆变换的2x3矩阵 inv_affine = torch.tensor([ [math.cos(-theta), -math.sin(-theta), -tx], [math.sin(-theta), math.cos(-theta), -ty] ])
把这个逆变换矩阵传入affine_grid,采样出来的图像就会符合你“先旋转再平移”的预期。
内容的提问来源于stack exchange,提问作者Leaf_in_Autumn
相关产品推荐
相关产品推荐

