如何用PyTorch固定图像高度并保持宽高比进行Resize?
解决方案:用Lambda变换封装自定义固定高度缩放逻辑
torchvision确实没有直接提供「固定高度并保持比例」的内置Resize选项,但可以用torchvision.transforms.Lambda把自定义缩放逻辑包装成标准变换,这样就能和其他变换组合成Compose,完全不用在Dataset的__getitem__里写额外代码。
具体实现代码
from torchvision import transforms target_height = 32 # 定义固定高度缩放的Lambda变换 fixed_height_resize = transforms.Lambda( lambda img: transforms.Resize( (target_height, int(img.width * (target_height / img.height))) )(img) ) # 组合成完整的变换链(示例) transform = transforms.Compose([ fixed_height_resize, transforms.ToTensor(), transforms.Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225]) ])
逻辑说明
- 对于输入图像
img,先计算新宽度:新宽度 = 原宽度 * (目标高度 / 原高度),确保宽高比完全保留 - 把计算好的
(target_height, 新宽度)传入Resize,直接得到固定高度的输出 - Lambda变换是torchvision的标准组件,能无缝融入变换组合,完全符合你想要的「优雅集成」需求
验证你的示例
- 图像1:64x200(HxW)→ 新宽度=200*(32/64)=100 → 输出32x100,和预期一致
- 图像2:200x64(HxW)→ 新宽度=64*(32/200)=10.24 → 取整为10 → 输出32x10,完全匹配你的需求
额外提示
如果需要对宽度做取整优化(比如取偶数),可以调整计算逻辑,比如把int()改成round()或者自定义取整规则,Lambda里的逻辑可以灵活修改,不影响变换链的结构。
内容的提问来源于stack exchange,提问作者Max Schmidt
相关产品推荐
相关产品推荐

