Pytorch中保存图片(tensor,cv2,pillow)
tensor直接保存
#!/usr/bin/env python # _*_ coding:utf-8 _*_ import torch from torchvision import utils as vutils def save_image_tensor(input_tensor: torch.Tensor, filename): """ 将tensor保存为图片 :param input_tensor: 要保存的tensor :param filename: 保存的文件名 """ assert (len(input_tensor.shape) == 4 and input_tensor.shape[0] == 1) # 复制一份 input_tensor = input_tensor.clone().detach() # 到cpu input_tensor = input_tensor.to(torch.device('cpu')) # 反归一化 # input_tensor = unnormalize(input_tensor) vutils.save_image(input_tensor, filename)
tensor转cv2保存
如果你是先转numpy,再交换维度,一定用transpose,而不是swapaxes,不然颜色会出问题= =
就像下面这张图
原图
tensor转cv2保存 正确的代码
#!/usr/bin/env python # _*_ coding:utf-8 _*_ import torch import cv2 def save_image_tensor2cv2(input_tensor: torch.Tensor, filename): """ 将tensor保存为cv2格式 :param input_tensor: 要保存的tensor :param filename: 保存的文件名 """ assert (len(input_tensor.shape) == 4 and input_tensor.shape[0] == 1) # 复制一份 input_tensor = input_tensor.clone().detach() # 到cpu input_tensor = input_tensor.to(torch.device('cpu')) # 反归一化 # input_tensor = unnormalize(input_tensor) # 去掉批次维度 input_tensor = input_tensor.squeeze() # 从[0,1]转化为[0,255],再从CHW转为HWC,最后转为cv2 input_tensor = input_tensor.mul_(255).add_(0.5).clamp_(0, 255).permute(1, 2, 0).type(torch.uint8).numpy() # RGB转BRG input_tensor = cv2.cvtColor(input_tensor, cv2.COLOR_RGB2BGR) cv2.imwrite(filename, input_tensor)
tensor转pillow保存
def save_image_tensor2pillow(input_tensor: torch.Tensor, filename): """ 将tensor保存为pillow :param input_tensor: 要保存的tensor :param filename: 保存的文件名 """ assert (len(input_tensor.shape) == 4 and input_tensor.shape[0] == 1) # 复制一份 input_tensor = input_tensor.clone().detach() # 到cpu input_tensor = input_tensor.to(torch.device('cpu')) # 反归一化 # input_tensor = unnormalize(input_tensor) # 去掉批次维度 input_tensor = input_tensor.squeeze() # 从[0,1]转化为[0,255],再从CHW转为HWC,最后转为numpy input_tensor = input_tensor.mul_(255).add_(0.5).clamp_(0, 255).permute(1, 2, 0).type(torch.uint8).numpy() # 转成pillow im = Image.fromarray(input_tensor) im.save(filename)
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了