Torch中Tensor与Numpy或各种图像格式的相互转化

在这篇文章中:
前言
格式转换
PIL与Tensor
numpy与Tensor
注意
前言
在pytorch中经常会遇到图像格式的转化,例如将PIL库读取出来的图片转化为Tensor,亦或者将Tensor转化为numpy格式的图片。而且使用不同图像处理库读取出来的图片格式也不相同,因此,如何在pytorch中正确转化各种图片格式(PIL、numpy、Tensor)是一个在调试中比较重要的问题。

本文主要说明在pytorch中如何正确将图片格式在各种图像库读取格式以及tensor向量之间转化的问题。以下代码经过测试都可以在Pytorch-0.4.0或0.3.0版本直接使用。

对python不同的图像库读取格式有疑问可以看这里:https://oldpan.me/archives/pytorch-transforms-opencv-scikit-image

格式转换
我们一般在pytorch或者python中处理的图像无非这几种格式:

PIL:使用python自带图像处理库读取出来的图片格式
numpy:使用python-opencv库读取出来的图片格式
tensor:pytorch中训练时所采取的向量格式(当然也可以说图片)
注意,之后的讲解图片格式皆为RGB三通道,24-bit真彩色,也就是我们平常使用的图片形式。

PIL与Tensor
PIL与Tensor的转换相对容易些,因为pytorch已经提供了相关的代码,我们只需要搭配使用即可:

所有代码都已经引用了(之后的代码省略引用部分):

import torch
from PIL import Image
import matplotlib.pyplot as plt

# loader使用torchvision中自带的transforms函数
loader = transforms.Compose([
    transforms.ToTensor()])  

unloader = transforms.ToPILImage()

1 PIL读取图片转化为Tensor
# 输入图片地址
# 返回tensor变量

def image_loader(image_name):
    image = Image.open(image_name).convert('RGB')
    image = loader(image).unsqueeze(0)
    return image.to(device, torch.float)


2 将PIL图片转化为Tensor
# 输入PIL格式图片
# 返回tensor变量

def PIL_to_tensor(image):
    image = loader(image).unsqueeze(0)
    return image.to(device, torch.float)


3 Tensor转化为PIL图片
# 输入tensor变量
# 输出PIL格式图片

def tensor_to_PIL(tensor):
    image = tensor.cpu().clone()
    image = image.squeeze(0)
    image = unloader(image)
    return image


4 直接展示tensor格式图片

def imshow(tensor, title=None):
    image = tensor.cpu().clone()  # we clone the tensor to not do changes on it
    image = image.squeeze(0)  # remove the fake batch dimension
    image = unloader(image)
    plt.imshow(image)
    if title is not None:
        plt.title(title)
    plt.pause(0.001)  # pause a bit so that plots are updated


5 直接保存tensor格式图片

def save_image(tensor, **para):
    dir = 'results'
    image = tensor.cpu().clone()  # we clone the tensor to not do changes on it
    image = image.squeeze(0)  # remove the fake batch dimension
    image = unloader(image)
    if not osp.exists(dir):
        os.makedirs(dir)
    image.save('results_{}/s{}-c{}-l{}-e{}-sl{:4f}-cl{:4f}.jpg'
               .format(num, para['style_weight'], para['content_weight'], para['lr'], para['epoch'],
                       para['style_loss'], para['content_loss']))


cuda类型的Tensor转化为cpu类类型的numpy

im = im.data.cpu().numpy()


--------------------- 
作者:Mr丶营先生 
来源:CSDN 
原文:https://blog.csdn.net/qq_36955294/article/details/82888443 
版权声明:本文为博主原创文章,转载请附上博文链接!

  • 4
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值