AI智能
改变未来

Python图像读写方法对比

1实验标准

  因为训练使用的框架是Pytorch,因此读取的实验标准如下:

  1、读取分辨率都为1920×1080的5张图片(png格式一张,jpg格式四张)并保存到数组。

  2、将读取的数组转换为维度顺序为CxHxW的Pytorch张量,并保存到显存中(我使用GPU训练),其中三个通道的顺序为RGB。

  3、记录各个方法在以上操作中所耗费的时间。因为png格式的图片大小差不多是质量有微小差异的jpg格式的10倍,所以数据集通常不会用png来保存,就不比较这两种格式的读取时间差异了。

  写入的实验标准如下:

  1、将5张1920×1080的5张图像对应的Pytorch张量转换为对应方法可使用的数据类型数组。

  2、以jpg格式保存五张图片。

  3、记录各个方法保存图片所耗费的时间。

2实验情况

2.1cv2

  因为有GPU,所以cv2读取图片有两种方式:

  1、先把图片都读取为一个numpy数组,再转换成保存在GPU中的pytorch张量。

  2、初始化一个保存在GPU中的pytorch张量,然后将每张图直接复制进这个张量中。

  第一种方式实验代码如下:

import os, torchimport cv2 as cvimport numpy as npfrom time import timeread_path = \'D:test\'write_path = \'D:test\\\\write\\\\\'# cv2读取 1start_t = time()imgs = np.zeros([5, 1080, 1920, 3])for img, i in zip(os.listdir(read_path), range(5)):img = cv.imread(filename=os.path.join(read_path, img))imgs[i] = imgimgs = torch.tensor(imgs).to(\'cuda\')[...,[2,1,0]].permute([0,3,1,2])/255print(\'cv2 读取时间1:\', time() - start_t)# cv2保存start_t = time()imgs = (imgs.permute([0,2,3,1])[...,[2,1,0]]*255).cpu().numpy()for i in range(imgs.shape[0]):cv.imwrite(write_path + str(i) + \'.jpg\', imgs[i])print(\'cv2 保存时间:\', time() - start_t)

 实验结果:

cv2 读取时间1: 0.39693760871887207
cv2 保存时间: 0.3560612201690674

第二种方式实验代码如下:

import os, torchimport cv2 as cvimport numpy as npfrom time import timeread_path = \'D:test\'write_path = \'D:test\\\\write\\\\\'# cv2读取 2start_t = time()imgs = torch.zeros([5, 1080, 1920, 3], device=\'cuda\')for img, i in zip(os.listdir(read_path), range(5)):img = torch.tensor(cv.imread(filename=os.path.join(read_path, img)), device=\'cuda\')imgs[i] = imgimgs = imgs[...,[2,1,0]].permute([0,3,1,2])/255print(\'cv2 读取时间2:\', time() - start_t)# cv2保存start_t = time()imgs = (imgs.permute([0,2,3,1])[...,[2,1,0]]*255).cpu().numpy()for i in range(imgs.shape[0]):cv.imwrite(write_path + str(i) + \'.jpg\', imgs[i])print(\'cv2 保存时间:\', time() - start_t)

  实验结果:

cv2 读取时间2: 0.23636841773986816
cv2 保存时间: 0.3066873550415039

2.2matplotlib

  同样两种读取方式,第一种代码如下:

import os, torchimport numpy as npimport matplotlib.pyplot as pltfrom time import timeread_path = \'D:test\'write_path = \'D:test\\\\write\\\\\'# matplotlib 读取 1start_t = time()imgs = np.zeros([5, 1080, 1920, 3])for img, i in zip(os.listdir(read_path), range(5)):img = plt.imread(os.path.join(read_path, img))imgs[i] = imgimgs = torch.tensor(imgs).to(\'cuda\').permute([0,3,1,2])/255print(\'matplotlib 读取时间1:\', time() - start_t)# matplotlib 保存start_t = time()imgs = (imgs.permute([0,2,3,1])).cpu().numpy()for i in range(imgs.shape[0]):plt.imsave(write_path + str(i) + \'.jpg\', imgs[i])print(\'matplotlib 保存时间:\', time() - start_t)

  实验结果:

matplotlib 读取时间1: 0.45380306243896484
matplotlib 保存时间: 0.768944263458252

  第二种方式实验代码:

import os, torchimport numpy as npimport matplotlib.pyplot as pltfrom time import timeread_path = \'D:test\'write_path = \'D:test\\\\write\\\\\'# matplotlib 读取 2start_t = time()imgs = torch.zeros([5, 1080, 1920, 3], device=\'cuda\')for img, i in zip(os.listdir(read_path), range(5)):img = torch.tensor(plt.imread(os.path.join(read_path, img)), device=\'cuda\')imgs[i] = imgimgs = imgs.permute([0,3,1,2])/255print(\'matplotlib 读取时间2:\', time() - start_t)# matplotlib 保存start_t = time()imgs = (imgs.permute([0,2,3,1])).cpu().numpy()for i in range(imgs.shape[0]):plt.imsave(write_path + str(i) + \'.jpg\', imgs[i])print(\'matplotlib 保存时间:\', time() - start_t)

  实验结果:

matplotlib 读取时间2: 0.2044532299041748
matplotlib 保存时间: 0.4737534523010254

  需要注意的是,matplotlib读取png格式图片获取的数组的数值是在[0,1][0,1]范围内的浮点数,而jpg格式图片却是在[0,255][0,255]范围内的整数。所以如果数据集内图片格式不一致,要注意先转换为一致再读取,否则数据集的预处理就麻烦了。

2.3PIL

  PIL的读取与写入并不能直接使用pytorch张量或numpy数组,要先转换为Image类型,所以很麻烦,时间复杂度上肯定也是占下风的,就不实验了。

2.4torchvision

  torchvision提供了直接从pytorch张量保存图片的功能,和上面读取最快的matplotlib的方法结合,代码如下:

import os, torchimport matplotlib.pyplot as pltfrom time import timefrom torchvision import utilsread_path = \'D:test\'write_path = \'D:test\\\\write\\\\\'# matplotlib 读取 2start_t = time()imgs = torch.zeros([5, 1080, 1920, 3], device=\'cuda\')for img, i in zip(os.listdir(read_path), range(5)):img = torch.tensor(plt.imread(os.path.join(read_path, img)), device=\'cuda\')imgs[i] = imgimgs = imgs.permute([0,3,1,2])/255print(\'matplotlib 读取时间2:\', time() - start_t)# torchvision 保存start_t = time()for i in range(imgs.shape[0]):utils.save_image(imgs[i], write_path + str(i) + \'.jpg\')print(\'torchvision 保存时间:\', time() - start_t)

  实验结果:

matplotlib 读取时间2: 0.15358829498291016
torchvision 保存时间: 0.14760661125183105

  可以看出这两个是最快的读写方法。另外,要让图片的读写尽量不影响训练进程,我们还可以让这两个过程与训练并行。另外,utils.save_image可以将多张图片拼接成一张来保存,具体使用方法如下:

utils.save_image(tensor = imgs,   # 要保存的多张图片张量 shape = [n, C, H, W]fp = \'test.jpg\',  # 保存路径nrow = 5,     # 多图拼接时,每行所占的图片数padding = 1,    # 多图拼接时,每张图之间的间距normalize = True, # 是否进行规范化,通常输出图像用tanh,所以要用规范化range = (-1,1))  # 规范化的范围

以上就是Python图像读写方法对比的详细内容,更多关于python 图像读写的资料请关注脚本之家其它相关文章!

您可能感兴趣的文章:

  • Python空间数据处理之GDAL读写遥感图像
  • Python各类图像库的图片读写方式总结(推荐)
  • python 对一幅灰度图像进行直方图均衡化
  • 详解基于python的图像Gabor变换及特征提取
  • Python+OpenCV图像处理――图像二值化的实现
  • Python+OpenCV图像处理――实现轮廓发现
  • Python+OpenCV图像处理――实现直线检测
  • Python+OpenCV图像处理―― 色彩空间转换
  • 如何使用Python调整图像大小
  • Python Opencv图像处理基本操作代码详解
  • Python图像处理二值化方法实例汇总
赞(0) 打赏
未经允许不得转载:爱站程序员基地 » Python图像读写方法对比