transforms平移操作的填充问题

本来需要对一个图片张量进行平移操作,准备使用transforms.functional.affine来完成,该函数使用方法如下(只是对原函数进行翻译):

affine函数使用的参数及格式如下:
    img (PIL Image 或 Tensor): 要进行变换的图像。
    angle (number): 旋转角度(以度为单位),取值范围为 -180 到 180,顺时针方向为正方向。
    translate (sequence of integers): 水平和垂直平移量(旋转后的平移量)。
    scale (float): 整体缩放比例。
    shear (float or sequence): 剪切角度(以度为单位),取值范围为 -180 到 180,顺时针方向为正方向。如果指定了一个序列,则第一个值对应于沿 x 轴的剪切,而第二个值对应于沿 y 轴的剪切。
    interpolation (InterpolationMode): 所需的插值方法,由:class:`torchvision.transforms.InterpolationMode` 枚举定义。默认值为 ``InterpolationMode.NEAREST``。如果输入是 Tensor,则仅支持 ``InterpolationMode.NEAREST`` 和 ``InterpolationMode.BILINEAR``。为了向后兼容,仍然接受整数值(例如 ``PIL.Image[.Resampling].NEAREST``),但自 0.13 版本以来已被弃用,并将在 0.15 版本中删除。请使用 InterpolationMode 枚举。
    fill (sequence or number, optional): 变换后图像外部区域的像素填充值。如果给定一个数字,则分别用于所有通道。.. 注意::在 torchscript 模式下,不支持单个 int/float 值,请使用长度为 1 的序列:``[value, ]``。
    center (sequence, optional): 可选的旋转中心。原点是图像的左上角。默认值为图像中心。

可以看出,affine函数只能通过设置fill对空白区域进行常值(constant)填充,这无疑会削弱平移之后的图像特征(由于大量噪声的加入)。

此时,就需要寻找affine函数真正的填充函数是什么。于是,就开始了漫长的跳转寻找。。。从transforms.functional.affine找到F_t.affine,终于找到_apply_grid_transform函数。

_apply_grid_transform函数是直接对tensor进行栅格操作的,可以说,这就是transforms系列函数的内核操作所在。理所当然地,这里面有对tensor对象的填充操作,通过栅格采样函数实现如下。

img = grid_sample(img, grid, mode=mode, padding_mode="zeros", align_corners=False)

那么,只需要小小改动padding_mode就可以将之前困扰许久的常数值填充改成别的模式(有三个模式zeros,border,reflection)了!

BTW,如果是PIL格式图片或许可以先转换成tensor进行操作,不过也许有更简单的方法,欢迎评论区交流!

2024/03/08

忽然想起之前修过的跟这个有关的一个bug,过来码一下。

由于上述更改是在torchvision的封装库里面进行的,所以如果你不小心更改了环境中的torchvision的版本(或者甚至是重新装了一下一样的版本),都有可能导致上述更改的丢失,最好在发现代码运行结果不对劲的时候,回来查看一下哦。

  • 8
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值