【matplotlib&torchvision&torch】图片的保存,呈现(plt.imshow),读取;将tensor保存为图片

34 篇文章 14 订阅

经过 pytorch 模型输出的图像以 array 的形式呈现,其shape 如下(图片数量,通道数,长,宽),本文结合代码,介绍如何使用 matplotlib.pyplot.imsave()torchvision.utils.save_image() 将上述形式的图像保存下来。

归一化和反归一化

我们一般在模型训练之前,会把训练数据归一化(缩放均值为0方差为1),所以模型的输出也是归一化以后的输出,如果要保存图片,记得要进行反归一化(缩放到0-1的区间并还原原来的方差)后再保存。

归一化和反归一化的方法如下:
https://blog.csdn.net/weixin_42468475/article/details/121869314

注意

  1. 如果保存为png格式的图片,那么再次打开后会发现其格式是(长,宽,4)的四通道而不是三通道图片,这是因为第一个通道代表了透明度,因此建议保存为jpg格式的图片。

  2. 如果用 plt.savefig() 进行图片的保存,会存在色差问题,因为 matplotlib 默认会把图片的第一个像素点设置成某种紫色,并不是实际意义上真正的颜色,参考:https://blog.csdn.net/qq_41537900/article/details/125203143,如果需要呈现正确的rgb图案并且顺利保存,需要在呈现图片的代码(plt.imshow())前加一句:plt.set_cmap('binary') 就行了。

matplotlib.pyplot.imsave() 保存单张图片

打印和保存图片的格式维度都是:(长,宽,通道数)

import matplotlib.pyplot as plt
import numpy as np
import torch

pic = torch.rand(1,3,32,32) # 创建一个三通道的彩色噪声图像
pic  = pic.permute(0,2,3,1) # 记得要先进性维度的调整。通道数放最后
pic = np.array(pic) # 要转换成 np.array 才行
plt.imshow(pic[0]) # 先看看图片啥样 
plt.imsave('./test.png', pic[0])  # 保存时候的维度是 (长,宽,通道数),没有图片数量一说

在这里插入图片描述

在这里插入图片描述

使用 torchvision.utils.save_image 将多个图片放进一张图里保存

torchvision.utils.save_image() 的保存不需要将维度进行转换,保存的维度为:(样本数目,通道数,长,宽),并且其可以自动进行 normalize。

import matplotlib.pyplot as plt
import numpy as np
import torch
import torchvision

pic = torch.rand(16,3,32,32) # 创建16个三通道的彩色噪声图像
for i in range(16):  # 突出显示不同图片的差异
	pic[i] = torch.ones(3,32,32)*i/16

torchvision.utils.save_image(pic,'./test2.png',nrow=4,normalize=True)

在这里插入图片描述

使用 torchvision 直接读取图片

先前读取图片到 torch.tensor 得先借助 PIL 这样的图片处理库,读取出来的格式由 (长,宽,通道数) 还得通过一定的函数转换成 (通道数,长,宽),参见:
https://blog.csdn.net/weixin_42468475/article/details/121869314
但是 torchvision 本身可以直接读取图片,并按照 (通道数,长,宽) 的格式输出。

from torchvision.io import image

img=image.read_image('./test2.png')
print(type(img))
print(img.shape)

在这里插入图片描述

  • 3
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

学渣渣渣渣渣

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值