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

 


 

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