Python图像读写方法对比


Posted in Python onNovember 16, 2020

1  实验标准

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

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

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

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

写入的实验标准如下:

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

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

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

2  实验情况

2.1  cv2

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

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

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

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

import os, torch
import cv2 as cv 
import numpy as np 
from time import time 
 
read_path = 'D:test'
write_path = 'D:test\\write\\'
 
# cv2读取 1
start_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] = img 
imgs = torch.tensor(imgs).to('cuda')[...,[2,1,0]].permute([0,3,1,2])/255 
print('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, torch
import cv2 as cv 
import numpy as np 
from time import time 
 
read_path = 'D:test'
write_path = 'D:test\\write\\'
 
 
# cv2读取 2
start_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] = img  
imgs = imgs[...,[2,1,0]].permute([0,3,1,2])/255 
print('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.2  matplotlib

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

import os, torch 
import numpy as np
import matplotlib.pyplot as plt 
from time import time 
 
read_path = 'D:test'
write_path = 'D:test\\write\\'
 
# matplotlib 读取 1
start_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] = img  
imgs = torch.tensor(imgs).to('cuda').permute([0,3,1,2])/255 
print('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, torch 
import numpy as np
import matplotlib.pyplot as plt 
from time import time 
 
read_path = 'D:test'
write_path = 'D:test\\write\\'
 
# matplotlib 读取 2
start_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] = img  
imgs = imgs.permute([0,3,1,2])/255 
print('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.3  PIL

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

2.4  torchvision

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

import os, torch 
import matplotlib.pyplot as plt 
from time import time 
from torchvision import utils 

read_path = 'D:test'
write_path = 'D:test\\write\\'
 
# matplotlib 读取 2
start_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] = img  
imgs = imgs.permute([0,3,1,2])/255 
print('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 相关文章推荐
python使用PyFetion来发送短信的例子
Apr 22 Python
python关闭windows进程的方法
Apr 18 Python
python实现备份目录的方法
Aug 03 Python
Python批量修改文本文件内容的方法
Apr 29 Python
Python sqlite3事务处理方法实例分析
Jun 19 Python
Scrapy爬虫实例讲解_校花网
Oct 23 Python
python画图--输出指定像素点的颜色值方法
Jul 03 Python
利用pandas合并多个excel的方法示例
Oct 10 Python
Django 自定义权限管理系统详解(通过中间件认证)
Mar 11 Python
python安装和pycharm环境搭建设置方法
May 27 Python
python 基于opencv实现图像增强
Dec 23 Python
Python手拉手教你爬取贝壳房源数据的实战教程
May 21 Python
python3中编码获取网页的实例方法
Nov 16 #Python
Python3中小括号()、中括号[]、花括号{}的区别详解
Nov 15 #Python
Python根据URL地址下载文件并保存至对应目录的实现
Nov 15 #Python
python re的findall和finditer的区别详解
Nov 15 #Python
Python获取android设备cpu和内存占用情况
Nov 15 #Python
Python __slots__的使用方法
Nov 15 #Python
Python descriptor(描述符)的实现
Nov 15 #Python
You might like
php 数组的一个悲剧?
2011/05/11 PHP
让CodeIgniter的ellipsize()支持中文截断的方法
2014/06/12 PHP
thinkphp中字符截取函数msubstr()用法分析
2016/01/09 PHP
AJAX 网页保留浏览器前进后退等功能
2011/02/12 Javascript
JQuery选择器特辑 详细小结
2012/05/14 Javascript
JS上传图片前的限制包括(jpg jpg gif及大小高宽)等
2012/12/19 Javascript
简略说明Javascript中的= =(等于)与= = =(全等于)区别
2013/04/16 Javascript
捕获和分析JavaScript Error的方法
2014/03/25 Javascript
Javascript 实现放大镜效果实例详解
2016/12/03 Javascript
Bootstrap基本样式学习笔记之按钮(4)
2016/12/07 Javascript
Angular的$http的ajax的请求操作(推荐)
2017/01/10 Javascript
Thinkjs3新手入门之添加一个新的页面
2017/12/06 Javascript
vue2 mint-ui loadmore实现下拉刷新,上拉更多功能
2018/03/21 Javascript
jQuery实现表单动态加减、ajax表单提交功能
2018/06/08 jQuery
微信小程序代码上传、审核发布小程序
2019/05/18 Javascript
基于JS抓取某高校附近共享单车位置 使用web方式展示位置变化代码实例
2019/08/27 Javascript
javascript头像上传代码实例
2019/09/28 Javascript
vue组件中节流函数的失效的原因和解决方法
2020/12/02 Vue.js
python执行等待程序直到第二天零点的方法
2015/04/23 Python
pytorch cnn 识别手写的字实现自建图片数据
2018/05/20 Python
详解js文件通过python访问数据库方法
2019/03/03 Python
Python实现的统计文章单词次数功能示例
2019/07/08 Python
wxpython+pymysql实现用户登陆功能
2019/11/19 Python
使用OpenCV circle函数图像上画圆的示例代码
2019/12/27 Python
浅谈图像处理中掩膜(mask)的意义
2020/02/19 Python
lululemon美国官网:瑜伽服+跑步装备
2018/11/16 全球购物
英国在线潜水商店:Simply Scuba
2019/03/25 全球购物
俄罗斯香水和化妆品在线商店:Aroma-butik
2020/02/28 全球购物
大学生就业自荐信
2013/10/26 职场文书
西北政法大学自主招生自荐信
2014/01/29 职场文书
大队干部竞选演讲稿
2014/04/28 职场文书
我的长生果教学反思
2014/04/28 职场文书
电子信息工程专业求职信
2014/06/28 职场文书
优秀大学生事迹材料
2014/12/24 职场文书
工厂采购员岗位职责
2015/04/07 职场文书
故意杀人罪辩护词
2015/05/21 职场文书