pytorch中用到的图像数据及格式变换

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都是HWCPIL W H C; 而pytorchNCHW

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()

 


 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章