一、读取图片(该图片为RGB三通道,高为400像素,宽为380像素)
调用OpenCV、PIL和numpy库,下面代码默认已调用库
import cv2
from PIL import Image
import numpy as np
import torchvision.transforms as transforms
OpenCV读取图片:
img_cv2_BGR = cv2.imread("Lena.jpg")
img_cv2 = cv2.cvtColor(img_cv2_BGR, cv2.COLOR_BGR2RGB)
print(type(img_cv2))
print(img_cv2.shape)
print(img_cv2.dtype)
---------------------------------
<class 'numpy.ndarray'>
(400, 380, 3)
uint8
1、得到的是ndarray的格式。
2、image.shap表示图像的形状(H W C),其中C表示通道数/深度,它的顺序为BGR
3、image.dtype表示图像数据类型unit8(0-255)
PIL读取图片:
img_PIL = Image.open("Lena.jpg")
print(type(img_PIL))
--------------------------------
<class 'PIL.PngImagePlugin.PngImageFile'>
1、得到的是PIL的图片格式。
二、格式转换
PIL图转为numpy.ndarray的格式
img_PIL = Image.open("Lena.jpg")
array_img_PIL = np.array(img_PIL)
print(type(array_img_PIL))
----------------------------------
<class 'numpy.ndarray'>
numpy.ndarray转为PIL的格式
img_cv2 = cv2.imread("Lena.jpg")
img_PIL = Image.fromarray(img_cv2)
print(type(img_PIL))
----------------------------------
<class 'PIL.Image.Image'>
numpy.ndarray转为tensor的格式
img_cv2 = cv2.imread("Lena.jpg")
transforms = transforms.ToTensor()
img_tensor = transforms(img_cv2)
print(type(img_tensor))
print(img_tensor.shape)
----------------------------------
<class 'torch.Tensor'>
torch.Size([3, 400, 380])
1、转为tensor后像素灰度值由之前[255,0]的整数区间归一化为[1,0]的小数区间。
tensor转为numpy.ndarray的格式
img_numpy = img_tensor.squeeze().cpu().numpy() * 255.0
img_numpy = np.transpose(img_numpy, [1, 2, 0])
print(type(img_numpy))
------------------------------
<class 'numpy.ndarray'>
1、此处举例的tensor维度为[1,3,400,380],转换后维度为[400,380,3]
2、可自行根据tensor数据进行调整,比如反归一化(*255)、toCPU(.cpu())、维度转换(transpose)等
3、若是tensor维度为[3,400,380]则无须使用.squeeze()
4、建议使用torchvision.utils.save_image直接保存图像
三、保存图片
保存numpy.ndarray格式为图片
cv2.imwrite("./myLena.jpg", img_cv2)
保存tensor格式为图片
torchvision.utils.save_image(img_tensor, "./myLena.jpg")