pytorch实现图像中的仿射、平移、缩放、旋转等变换

最近在做关于深度图像配准、图像矫正等相关算法,因此需要实现对图像的仿射变换,总结一些方法:
opencv实现各种图像变换:
1.cv2.warpAffine()放射变换函数,可实现旋转,缩放,平移;变换后的平行线依旧平行,
2.cv2.warpPerspective()透视变换函数,可保持直线不变形,但是平行线可能不再平行
可以参考下面的博客:
cv2.warpAffine(),cv2.warpPerspective()函数解析
那么在使用深度学习中,就需要用到pytorch实现图像的各种变换,一般可以用F.affine_grid () +F.grid_sample() 这两个函数解决:

  1. F.grid_sample(inpput, grid),其中img为图像,vgrid为变形场:
    input 尺寸:(N,C,Hin,Win), grid尺寸:(N,Hout,Wout,2),
    输出尺寸(N,C,Hout,Wout)
    这里的input和output就是输入的图片,或者是网络中的feature map。关键的处理过程在于grid,grid的最后一维的大小为2,即表示input中pixel的位置信息(x,y) ,这里一般会将x和y的取值范围归一化到 [-1,1] 之间, [-1,-1] 表示input左上角的像素的坐标,[1,1] 表示input右下角的像素的坐标,对于超出这个范围的坐标[x,y],函数将会根据参数padding_mode的设定进行不同的处理。具体可以参考:grid_sample函数
  2. F.affine_grid () 用来生成vgrid这个形变场,例如图像的缩放可以用下列操作实现:`
from torch.nn import functional as F

theta = torch.tensor([
    [0.5, 0  , 0],
    [0  , 0.5, 0]
], dtype=torch.float)
grid = F.affine_grid(theta.unsqueeze(0), img_torch.unsqueeze(0).size())
output = F.grid_sample(img_torch.unsqueeze(0), grid)
new_img_torch = output[0]
plt.imshow(new_img_torch.numpy().transpose(1,2,0))
plt.show()

类似的可以实现平移,旋转等操作,或者在深度配准算法中通过预测形变场直接使用F.grid_sample对图像进行形变/配准,使用方法可以参考这个博客:
F.grid_sample,F.affine_grid使用方法

对于形变场有疑问,或者有意向做深度配准的小伙伴可以关注这个博主:
爱分享的毛毛

你可能感兴趣的:(pytorch实现图像中的仿射、平移、缩放、旋转等变换)