数据预处理(一)图片的读取和保存

在训练我们搭建好的深度学习网络之前,数据的预处理至关重要。数据处理的第一步即读取图片,python中的各种库支持多种不同的读取和保存方法,本文记录遇到的不同读取和保存方法及相应的踩坑记录并搜集相关信息,并保持更新,有不对或不周之处请各位读者批评指正。
具体的底层实现请自行参阅源码或博客注释。
处理图片时,比较关注读入图片的类型、像素值类型及大小、通道数目与顺序。

matplotlib

pyplot

在matplotlib的源码中,pyplot的imread与imsave都是调取了matplotlib.image中的imread与imsave,所以也可以直接import image模块。

imread

如果是png格式返回的是一个[0,1]之间的float类型数组,jpg格式返回的是[0,255]。

import matplotlib.pyplot as plt

image_path = "/public/cifar/0.png" 
img = plt.imread(image_path) # matplotlib只能本机读取png格式,如果要读取其他格式,要确保安装了pillow库
printtype(img)# <class 'numpy.ndarray'> 读进来为numpy数组
print(img.shape) # (32,32,4)形状为HWC的RGB格式,因为png多了一个a通道

imsave

numpy数组float类型值要在[-1,1]之间,uint8值要在[0,255]之间才能正确保存,且只支持(M,N)(M,N,3)(M,N,4)形式。
注意:即使是单通道灰度图像,使用imsave也会保存为3通道或者4通道。

imsave("filename",img)# 如filename =/experiment/map/1.jpg 

skimage

安装scikit-image:conda install scikit-image

skimage.io

imread

返回的也是一个ndarray对象,uint8类型,值范围0~255,RGB格式,HWC。

from skimage.io import imread,imsave

image_path = "/public/cifar/0.png" 
img = imread(image_path) 

imsave

float值要在[-1,1]间,uint8值要在[0,255],保存的是ndarray。
可保存单/3/4通道。

imsave(filename,img)

PIL

Image

open jpg格式图片返回的是image对象,RGB模式(即使不是常用convert转换为RGB),size为WH,并不返回通道数。
Image转换为array后数值为uint8类型。

from PIL import Image
import numpy as np
 
image_path="/public/model.jpg" 
img=Image.open(image_path)
img = img.convert('RGB')
print(type(img))  # 结果为<class 'PIL.JpegImagePlugin.JpegImageFile'> 
print(img.size) # (160,64) W*H
img.save('./model.png')

# Image转换为numpy arrary
img1=np.array(img)
print(type(img1)) # 结果为<class 'numpy.ndarray'> 
print(img1.shape) # 现在可以使用shape了,结果为(64,160,3) HWC
# numpy转换为Image
img2 = Image.fromarray(img1)
print(type(img2)) # 结果为<class 'PIL.Image.Image'> 
img2.save('2.jpg')

opencv

cv2.imread(filename,flags)

filename为图片路径,flags有三种:

  • cv2.IMREAD_COLOR:默认参数,读入一副彩色图片,忽略alpha通道
  • cv2.IMREAD_GRAYSCALE:读入灰度图片
  • cv2.IMREAD_UNCHANGED:读入完整图片,包括alpha通道(png)

读入的图片为BGR模式,HWC格式的多维数组,0-255.
转换模式:cv2.cvtColor

import cv2
img = cv2.imread("./image.jpg)
if img.shape[2] == 1:
      img = cv2.cvtColor(img, cv2.COLOR_GRAY2RGB)
else:
	  img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)

AttributeError: ‘NoneType’ object has no attribute ‘xxx’

读入图像后进行处理经常会遇到NoneType错误。这时候很多可能的原因。首先检查路径有无错误,若无错,若报cannot infer dytype of Nonetype则图片大概率是空的。其次cv2无法读取‘P’模式的图片,可先转换为RGB格式。读入图像时应考虑各种情况。

import cv2
filelist = ["1.jpg","2.jpg".....]
for item in filelist:
	try:
		img = cv2.imread("./image.jpg)
	except Exception as e:
		print(e)
		continue

pytorch中直接将tensor保存为图片

torchvision.utils

torchvision.utils.make_grid(tensor, nrow=8, padding=2, normalize=False, range=None, scale_each=False)
  • tensor:给定 4D mini-batch Tensor, 形状为 (B x C x H x W),或者一个a list of image,做成一个size为(B / nrow, nrow)的雪碧图;
    若tensor处输入的是一个tensor list如:
img_list = [tensor1,tensor2,tensor3]

则3个tensor的维度需一致,因为函数内部会使用torch.stack拼接。可自行使用cat或者是stack拼接。

  • normalize=True ,会将图片的像素值归一化处理
  • 如果 range=(min, max), min和max是数字,那么min,max用来规范化image
  • scale_each=True ,每个图片独立规范化,而不是根据所有图片的像素最大最小值来规范化。
torchvision.utils.save_image(tensor, filename, nrow=8, padding=2, normalize=False, range=None, scale_each=False)

将给定的Tensor保存成image文件。如果给定的是mini-batch tensor,那就用make-grid做成雪碧图,再保存。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值