Pytorch中的仿射变换

转载声明,借鉴于这里
pytorch里面的仿射变换,写出一些关于自己的理解。

1:基本原理

首先我们先搞明白旋转,其实很简单,如下图。就是基本的三角函数。其中其中 ρ \rho ρ表示 ( x , y ) (x, y) (x,y)点距离原点的距离。在这里插入图片描述
起始点 ( x , y ) (x, y) (x,y)逆时针旋转 θ \theta θ度以后,到 ( x ′ , y ′ ) (x',y') (xy)处,所以我们只要给出 θ \theta θ,就能通过上述公式,实现旋转。同时我们注意到在上述公式中,尾巴后面有个加[0, 0]的操作,其实这个操作加[0, 0]的操作就是实现该点的平移。如果我们把[0, 0]换成[500, 100],并且不进行旋转,这就等于让该点在水平方向上右移500,垂直方向上往下移动100。如下图所示。
在这里插入图片描述
所以对图像的仿射变换,一共包含六个参数,如下图所示,顾名思义,前两列的参数 [ A , B , C , D ] [A,B,C,D] [A,B,C,D]用于实现旋转,最后一列的参数 [ E , F ] [E,F] [E,F]用于平移。在这里插入图片描述

2:实际操作

好了,原理就那么多,开始上代码。先可视化图片。

from torchvision import transforms
from PIL import Image
import matplotlib.pyplot as plt
import numpy as np
import torch
from torch.nn import functional as F
import math

img_path = "img/img.png"
img_torch = transforms.ToTensor()(Image.open(img_path))
plt.imshow(img_torch.numpy().transpose(1, 2, 0))
plt.show()

在这里插入图片描述
下面开始仿射变换,进行仿射变换会用到affine_grid和grid_sample这两个函数。这两个函数下面解释,我觉得主要的还是要搞明白这个仿射变换矩阵的 作用是什么,为什么它是一个两行三列的矩阵。旋转结果如下图所示。当然
我这里没有进行平移操作。

# -----------------------
# 角度为-30度,就是顺时针旋转
# -----------------------
angle = -30 * math.pi / 180
# -----------------------
# 构造仿射变换矩阵,前两列用于旋转,
# 最后一列用于平移
# -----------------------
theta = torch.tensor([
    [math.cos(angle), math.sin(-angle), 0],
    [math.sin(angle), math.cos(angle), 0]
], dtype=torch.float)
# -----------------------
# pytorch中仿射变换需要用到
# affine_grid和grid_sample两个函数
# -----------------------
grid = F.affine_grid(theta.unsqueeze(0), img_torch.unsqueeze(0).size(), align_corners=True)
output = F.grid_sample(img_torch.unsqueeze(0), grid, align_corners=True)
new_img_torch = output[0]
plt.imshow(new_img_torch.numpy().transpose(1, 2, 0))
plt.show()

在这里插入图片描述

3:函数的说明

要使用 pytorch 的进行仿射操作,只需要两步:

第一步:创建网格,代码为torch.nn.functional.affine_grid(theta, size)其中theta就是我们之前说的仿射变换矩阵,size为希望仿射变换后图像的大小,其实我们可以通过调节size设置所得到的图像的大小(相当于resize);
第二步:进行重采样:代码为torch.nn.functional.grid_sample(inputs, grid, mode='bilinear'),其中inputs为输入的图像转换后的tensorgrid就是第一步的结果,mode可以设定为双线性插值等。

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值