PIL读取图片格式以及数据转换操作
最近在看图片处理和深度学习的知识,对于PIL库的数据处理进行学习理解以便记录。
1.PIL数据读取格式:
PIL库读取的图片格式是 H x W x C 格式的。比如一张图是128x128x3,图片格式PIL.PngImagePlugin.PngImageFile。
通过numpy.array(img)或者numpy.asarray(img),转化为uint8的数值数组形式,数值范围在0-255之间。两个函数的区别在于array函数会copy一个新的副本,占用新的空间,asarray不会。
import numpy as np
from PIL import Image
img = Image.open(path)
img = np.array(img) # img是数值范围在0-255之间的uint8格式数组
# 注意img的形状是 H x W x C
# 如果想改变数组形状,可以使用transpose(idx1, idx2, idx3)
2.转换为tensor形式:
在Pytorch中,图片张量形式是 C x H x W,所以要把数组转置转置,用到transpose
import torch
from torchvision import transforms
# 1.
img = np.array(img).transpose(2, 0, 1) # 表示C x H x W
img1 = torch.tensor(img / 255) # 神经网络里的张量数值一般在0-1之间归一化处理,所以除以255
# 此时获得的数组就是形状为C x H x W的张量,数值0-1
# dtype=torch.float64
# 2.
# 或者经过transforms处理
trans = transforms.Compose([
transforms.ToTensor()
])
img2 = trans(img) # 自动转化为形状CxHxW的张量形式
3.由tensor转换为图片
经过tensor的处理过程之后,要将tensor形式转换为图片。
用到numpy()函数,fromarray()函数。uint8函数
# 这里将tensor形式用numpy()函数转为数组形式,
# 并且用transpose将数组转置为PIL能够处理的WxHxC形式。
nimg = img.numpy().transpose(1,2,0)
img = nimg * 255 # 将原来tensor里0-1的数值乘以255,以便转为uint8数据形式,uint8是图片的数值形式。
#那么此时img就是原料,通过两种方式将img化为图片
# 第一种
Image.fromarray(np.uint8(img)) # eg1
# 第二种
Image.fromarray(img.astype(np.uint8))#eg2
转载
本文转载自:PIL数据读取与转换格式,tensor形式转为图片_pytorch_世事如棋乾坤难测-DevPress官方社区 (csdn.net)