深度学习(np,tensor,pil,cv2互转)
在做深度学习的时候经常会在这四种格式上互转。
转换时有几个需要注意的点:
1. np和cv2都能通过cv2.imshow显示出来。
2. torchvision的transforms会把HWC转为CHW。
3. from_numpy读取的HWC还是HWC,需要额外对tensor旋转。
4. pil和cv2读取的都是HWC格式,不过C中的BGR和RGB顺序不同。
下面是两两互转的例子:
import numpy as np import cv2 import torchvision import torch from PIL import Image img_pil = Image.open('1.jpg') img_cv2 = cv2.imread('1.jpg') #pil <-> np img_np = np.array(img_pil) img_pil = Image.fromarray(img_np) #pil <-> torch img_tensor = torchvision.transforms.ToTensor()(img_pil) img_pil = torchvision.transforms.ToPILImage()(img_tensor) #pil <-> cv2 img_cv2 = cv2.cvtColor(np.array(img_pil), cv2.COLOR_RGB2BGR) img_pil = Image.fromarray(cv2.cvtColor(img_cv2, cv2.COLOR_BGR2RGB)) #cv2 <-> np img_np = np.array(img_cv2) img_cv2 = img_np #直接给能imshow出来 # img_cv2 = cv2.cvtColor(np.array(img_cv2),cv2.COLOR_BGR2RGB) #网上常见的方法转一次颜色不对 # img_cv2 = cv2.cvtColor(img_cv2,cv2.COLOR_BGR2RGB) #需要再转一次 # cv2 <-> torch img_tensor = torchvision.transforms.ToTensor()(img_cv2) img_cv2 = img_tensor.permute(1,2,0).numpy() # np <-> torch img_tensor = torch.from_numpy(img_np) img_np = img_tensor.numpy() # img_pil.show() cv2.imshow('img',img_cv2) cv2.waitKey(0)