You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PyTorch affine_grid中仿射变换的执行顺序:先平移还是先旋转?

PyTorch affine_grid 变换顺序说明

affine_grid的核心逻辑是逆变换采样——你写的2x3仿射矩阵,是用来计算「输出图像的每个像素,对应输入图像的哪个位置」,而不是直接对输入图像执行正向变换。

你预期的是“输入图像先旋转,再平移”得到输出,但实际看到的是“先平移再旋转”的效果,问题就出在正变换和逆变换的顺序相反:

  • 正变换流程(你想要的效果):输入 → 旋转 → 平移 → 输出
  • 采样时的逆变换流程(affine_grid实际做的):输出像素需要从「输入先做平移的逆操作,再做旋转的逆操作」的位置取像素,最终视觉上就呈现出“先平移再旋转”的结果。

要实现你预期的“先旋转再平移”效果,需要构造正变换的逆矩阵传入affine_grid,步骤如下:

  1. 把平移量取反(原来的(-0.5,0)变成(0.5,0)),得到逆平移参数
  2. 把旋转角度取反(30度变成-30度),得到逆旋转矩阵
  3. 组合成最终的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.28 21:26:30