Loading

PIL和OpenCV读取图像的区别

image

SUMMARY

OpenCV读取:图片尺寸 ( H, W ),图片维度 ( H, W, C ), 通道顺序 ( B, G, R )
PIL读取:图片尺寸 ( W, H ),图片维度 ( C, H, W ), 通道顺序 ( R, G, B )

下面是一段自定义pytorch dataset的代码,分别使用OpenCV和PIL读取图片。

1.要引用的库
import numpy as np
import torch
from torch.utils.data.dataset import Dataset
from torch.utils.data.dataloader import DataLoader
from torchvision.transforms import transforms
import os
 
import cv2
from PIL import Image
2.使用OpenCV
class MyDataset(Dataset):
    def __init__(self, transform=None):
        self.transform = transforms.Compose([
            transforms.ToTensor()      # 这里仅以最基本的为例
        ])
        self.image_path = './image_data/'
        self.image_names = os.listdir(self.image_path)
 
    def __len__(self):
        return len(self.image_names)
 
    def __getitem__(self, item):
        image_name = self.image_names[item]
        # 以OpenCV方式读取:
        image = cv2.imread(os.path.join(self.image_path, image_name))   # 读到的是BGR数据
        image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)                  # 转化为RGB,也可以用img = img[:, :, (2, 1, 0)]
        image = torch.from_numpy(image).permute(2, 0, 1)                # 这时的image是H,W,C的顺序,因此下面需要转化为C, H, W
        return image
3.使用PIL
class MyDataset(Dataset):
    def __init__(self, transform=None):
        self.transform = transforms.Compose([
            transforms.ToTensor()      # 这里仅以最基本的为例
        ])
        self.image_path = './image_data/'
        self.image_names = os.listdir(self.image_path)
 
    def __len__(self):
        return len(self.image_names)
 
    def __getitem__(self, item):
	# 以PIL方式读取
        image_name = self.image_names[item]
        image = Image.open(os.path.join(self.image_path, image_name))  # 读取到的是RGB, C, H, W
        image = self.transform(image)   # 转化为tensor
	return image
posted @ 2021-11-19 17:00  少年人永远倔强  阅读(348)  评论(0编辑  收藏  举报