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