一、图像的读取
依赖库 | 读取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)