1.PIL :python内置的,python image library
2.cv2:opencv的python接口(读进来是ndarray格式,numpy的ndarray(cv2)就是各种格式之间的中转)
3.tensor:pytorch训练数据类型
对于通道上:除了opencv读进来是BGR,其他都是RGB。
对于维度上:TF(N H W C),opencv,plt都是HWC;PIL是 W H C; 而pytorch是NCHW
matpltlib.pyplot主要用来绘图显示用:
- plt显示numpy数组格式的RGB图像:如果是float32类型的图像,范围0-1;如果是uint8图像,范围是0-255;
- plt.imshow(image,cmap = 'gray'),灰度图显示要设置cmap参数
- 显示cv2的图像需要转换通道为RGB
PIL--->cv2:
from PIL import Image
import numpy as np
import cv2
img = Image.open('D:/1pic/g.jpg')
img = cv2.cvtColor(np.array(img),cv2.COLOR_RGB2BGR)#
cv2.imshow("img",img)
cv2.waitKey()
ndarray(cv2)--->PIL
- #ndarray转PIL要求数据类型dtype=uint8, range[0, 255] and shape H x W x C
from PIL import Image import numpy as np import cv2 img = cv2.imread('D:/1pic/g.jpg')#BGR img = cv2.cvtColor(np.array(img),cv2.COLOR_BGR2RGB) #必须的 img = Image.fromarray(img) #fromarray并不会做通道变换 img.show(img)
1.PIL--->tensor(opencv和PIL都是奇葩)
- 对于PILImage转化的Tensor,其数据类型是torch.FloatTensor
-
Image.open 返回的图片类型为PIL Image, 数值类型为uint8,值为0-255,尺寸为 W * H * C(宽度高度通道数)。通过img=np.array(img)转为numpy数组后,统一尺寸为 H * W * C。
2.tensor--->PIL
- #tensor转PIL,要求tensor必须是float类型的,为C x H x W格式,double的不可以!
- torchvision.transforms.ToPILImage()(image.float())
3.ndarray-->tensor
- 对ndarray的数据类型没有限制,但转化成的Tensor的数据类型是由ndarray的数据类型决定的。
- torchvision.transforms.ToTensor()(input)
不与输入共享内存的:
-
torch.Tensor(data):会给生成tensor默认float32类型,且不能用dtype参数进行修改
-
torch.tensor(data):会根据输入ndarray数据类型自动推断,且能通过dtype = ..修改生成tensor类型
与输入共享内存的(共用一个数据地址,会修改调原始数据):
-
torch.as_tensor(ndarray):会自动推断类型,接受ndarray类型及tensor类型。注意因为ndarray是放在cpu上的,若用GPU则需要从cpu copy到Gpu。共享内存对python的内置类型如list等不支持。
-
torch.from_numpy(data):会自动推断类型,只接受numpy的ndarray类型
4.tensor--->ndarray
-
tensor.numpy()