问题描述:在用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)
这下正常了