pytorch中张量Tensor和PIL Imgae、numpy(cv)格式的互相转换

python中图像的读取主要有两种方式:1.PIL Image;2.opencv读取
1.PIL image和 Tensor
PIL读取的文件主要是PIL格式,转化为Tensor张量只需要通过transforms.ToTensor()函数即可,而由tensor张量转换为PIL数据格式同样只需要函数transforms.ToPILImage()即可,如下面代码所示

image=Image.open('./VOCdevkit/VOC2012/JPEGImages/2011_003556.jpg')
image.show()
transform=transforms.ToTensor()
img=transform(image)
plt.figure()
plt.imshow(img)
uploader=transforms.ToPILImage()
img=uploader(img)
print(img)
img.show()

2.numpy格式和Tensor
图像数据转换为Tensor张量无非经过两个步骤,
1.通道维转换,由第三维转换为第一维 如果是多个样本就是第思维转换为第二维
2.数据归一化处理,又0—255的区间映射到0—1区间

所以按照这个步骤进行即可,另外注意要将opencv的BGR通道转换为RGB通道,由tensor逆推回numpy格式时则需要相反处理

image=cv2.imread('./VOCdevkit/VOC2012/JPEGImages/2011_003556.jpg')
print(image)
cv2.imshow("jj",image)
cv2.waitKey(0)
# numpy转化为tensor不可以使用ToTensor 而要手动修改
image=cv2.cvtColor(image,cv2.COLOR_BGR2RGB)
image=torch.from_numpy(image.transpose((2,0,1)))
image_tensor=image.float().div(255)
print(image_tensor)

# tensor转换为numpy格式
image=image_tensor.mul(255).byte()
image=image.numpy().transpose((1,2,0))
image=cv2.cvtColor(image,cv2.COLOR_RGB2BGR)
print(image)
cv2.imshow("hh",image)
cv2.waitKey(0)

这篇文章写的很详细
https://oldpan.me/archives/pytorch-tensor-image-transform

你可能感兴趣的:(python,deep,learning,pytorch)