Python PIL、cv2、Dataloader、plt读取/显示图像数据集对比实例

获得数据集是深度学习代码的首要步骤。下面我们使用相同的场景对PIL、cv2、Dataloader进行比较。
假设图像处于/single_images/images/目录下,尺寸64x64x3。

import numpy as np
import os
import matplotlib.pyplot as plt

1.PIL

from PIL import Image

images = os.listdir('./single_images/images/')
length = len(images)
for i in range(length):
    img = Image.open('./single_images/images/' + images[i]) #Image(64,64)RGB
    img0 = np.asarray(img,dtype='float32')  #numpy (64,64,3)

使用PIL得到的img0尺寸是(64x64x3),通道为RGB,取值范围0-255。

print(np.max(img0))  ##255.0
print(np.min(img0))  ##0.0
print(img0.shape)    ##(64,64,3)

2.DataLoader

import torchvision.transforms as transforms
from torch.utils.data import DataLoader
from torchvision.datasets import ImageFolder

transform = transforms.ToTensor()
dataset = ImageFolder('single_images',transform=transform)
dataloader = DataLoader(dataset, batch_size=4, shuffle=False, num_workers=0, drop_last=True)       
for i,data in enumerate(dataloader):   
    print(i)
    real, _ = data   

    for j in range(real.size()[0]):
        img_ = real[j,:,:,:]              
        img1 = np.array(img_)             #(3,64,64)

使用DataLoader得到的img1尺寸是(3x64x64),通道为RGB,适用于pytorch卷积的尺寸。取值范围是0-1。

print(img_.min()) #0.0
print(img_.max()) #1.0
print(img_.size()) #torch.Size([3,64, 64])

3.cv2

import cv2
images = os.listdir('./single_images/images/')
length = len(images)

for i in range(length):
    img = cv2.imread('./single_images/images/' + images[i]) #uint8(64,64,3)
#    pil_img = Image.fromarray(cv2.cvtColor(img,cv2.COLOR_BGR2RGB))
    img2 = np.asarray(img,dtype='float32')  #numpy (64,64,3)BGR
    img2 = img2[...,::-1]  #(64,64,3)RGB
    img2 = np.asarray(img2,dtype='float32')

使用cv2得到的img2尺寸是(64x64x3),通道为BGR,取值范围0-255。

print(np.max(img2))  ##255.0
print(np.min(img2))  ##0.0
print(img2.shape)    ##(64,64,3)

PIL/DataLoader/cv2三者关系

1.PIL和DataLoader:
将img0和img1进行对比:

img0 = np.transpose(img0,(2,0,1))      #numpy (3,64,64)
img00 = img0/255
sum(sum(sum(img00-img1)))#0

可以看出,**PIL的图像转为(3x64x64)之后再除以255归一化,就和DataLoader的像素是一样的。**所以,如果要训练图片,首选是DataLoader,输出类型就是归一化的tensor,而PIL改变尺寸再归一化变成tensor之后也是一样的。

2.PIL和cv2:
都是(64x64x3),但是RGB的顺序不同,对cv2的结果进行转换:

img2 = img2[...,::-1]  #(64,64,3)RGB
sum(sum(sum(img2-img0)))  ##280.0

发现PIL和cv2结果的像素值存在部分差异。

Python PIL、cv2、Dataloader、plt读取/显示图像数据集对比实例_第1张图片

4.plt

最后说显示的plt
输入的尺寸应该是(3x64x64)的。所以对于cv2和PIL都是不需要转换尺寸的。但是cv2需要转换通道顺序为RGB。

你可能感兴趣的:(深度学习)