一、图像的读取

依赖库 读取API 返回类型 shape dtype mode
opencv-python cv2.imread(‘test.jpg’) numpy.ndarray (h,w,c) ‘uint8’,[0-255] BGR
scikit-Image io.imread(‘test.jpg’) numpy.ndarray (h,w,c) ‘uint8’,[0-255] RGB
PIL.Image Image.open(‘test.jpg’) JpegImageFile (w,h) ‘int’,[0-255] RGB

​ 以上每种库读取的图片经过处理后如果要输入基于Pytorch的网络模型,基本都要转换为shape=(c,h,w),范围在[0-1]之间的torch.Tensor类型。所以一般要经过如下处理:

import torchvision.transforms as transforms
transform = transforms.Compose([
            transforms.ToTensor(), # 向量化,归一化,范围变为[0,1]
            transforms.Normalize((0.5, 0.5, 0.5), (0.5, 0.5, 0.5))
        ])

​ 三种库函数的读取函数使用如下:

# 方法一:使用opencv-python
import cv2
image = cv2.imread('test.jpg')
image_tensor = transform(image)
# 方法二:使用scikit-Image
from skimage import io
image= io.imread('test.jpg')
image_tensor = transform(image)
# 方法三:使用PIL.Image
from PIL import Image
image = Image.open('test.jpg')
image = np.array(image,dtype=np.float32)
image_tensor = transform(image)

二、图像的处理

1、使用torchvision的transforms

大多数数据集在读取图像后要使用一些图像处理手段,常见的是使用torchvision库里面的API:

import torchvision.transforms as transforms
preprocess = [transforms.Resize(int(opt.size * 1.12), Image.BICUBIC),# 对图片使用插值尺寸放大
              transforms.RandomCrop(opt.size),# 对图片依据给定的size随机裁剪
              transforms.RandomHorizontalFlip(),# 对图片依据p=0.5的概率随机进行水平翻转
             ]

2、使用albumentations

大多数数据集在读取图像后要使用一些图像处理手段,常见的是使用torchvision库里面的API:

import albumentations as albu # 导入数据扩增库
albu.Compose([albu.HorizontalFlip(),# 水平翻转图片
                                  ])
albu.OneOf([albu.HorizontalFlip(always_apply=True), # 水平翻转图片
            albu.ShiftScaleRotate(always_apply=True),# 随机应用仿射变换
            albu.Transpose(always_apply=True),# 图像转置,将图像行和列互换
            albu.OpticalDistortion(always_apply=True),# 对图像进行光学畸变
            albu.ElasticTransform(always_apply=True),# 随机对图像进行弹性变换。
           ]

三、图像的保存

图像在经过处理保存为文件时一般都需要将其从torch.Tensor()转换为numpy.ndarray类型:

def tensor2im(self, image_tensor, imtype=np.uint8):
    image_numpy = image_tensor[0].cpu().float().numpy()
    image_numpy = (np.transpose(image_numpy, (1, 2, 0)) + 1) / 2.0 * 255.0
    return image_numpy.astype(imtype)