PIL,cv2读取类型及 numpy,tensor格式转换

23 篇文章 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

or 使用

transforms中有直接将tensor转换成pil文件的,
transforms.ToPILImage

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值