torch.functional.affine_grid的坑

问题描述:在用torch进行图像仿射变换的时候,平移始终有问题

比如现在想要让一张图对应的tensor平移0.5个图像长度

那么需要先构造一个transform_matrix,这里网上说的是偏移量不是像素值,而是归一化的比例

shift_x = 0.5
shift_y = 0.5
transform_matrix = torch.tensor([
            [1, 0, shift_x],
            [0, 1 ,shift_y]]).unsqueeze(0) # 设B(batch size为1)

然后进行放射变换

origin_tensor = torch.randn(1,3,100,200) # B, C, H, W
grid = F.affine_grid(transform_matrix, # 旋转变换矩阵
                     origin_tensor.shape)	# 变换后的tensor的shape(与输入tensor相同)

output = F.grid_sample(origin_tensor, # 输入tensor,shape为[B,C,W,H]
					   grid, # 上一步输出的gird,shape为[B,C,W,H]
					   mode='nearest') # 一些图像填充方法,这里我用的是最近邻

但是得到的结果是图像只平移了不到一半

 

最后得出结论:归一化是把平移具体的的像素值offset归一化为[-1, 1]。向右向下是[-1,0](注意这里跟像素坐标系方向定义相反)。这里是图像中心来平移,因此在计算归一化值shift_x, shift_y的时候,除的是图像尺寸的一半。

简单来说,向某个方向平移的话,需要把平移的尺寸相对于全图尺寸的比例参数×2.

也就是说shift_x和shift_y这俩平移参数设置成1,才能平移半张图(相当于图像中心平移到图像边缘,[0,1]取上限了)。

shift_x = 1.0
shift_y = 1.0
transform_matrix = torch.tensor([
            [1, 0, shift_x],
            [0, 1 ,shift_y]]).unsqueeze(0) # 设B(batch size为1)

这下正常了

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值