opencv和PIL读取图片的速度对比
Posted SinHao22
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了opencv和PIL读取图片的速度对比相关的知识,希望对你有一定的参考价值。
目录
0. 应用场景
在Pytorch代码中,我们构建Dataset类时在‘getitem’方法中需要有读取数据的操作,而模型训练和预测过程中,数据的读取会占用一部分时间。何况数据集中有成千上万张图像,因此读取速度的快慢会影响模型训练和预测时的效率。
在代码中有两种常见的图片数据读取方式:opencv和PIL的Image读取。而opencv读取的数据直接是np.ndarray类型的,而PIL读取的数据是Image的class,还需要np.asarray()转换才行。
下面来检测下两者的读取速度差异:
1. 代码检测
分别读取同样尺寸(500x442)的jpg和png图像100次,如下:
import cv2
from PIL import Image
import os
import time
import numpy as np
if __name__ == '__main__':
# 比较PIL和opencv读取jpg图片到numpy.ndarray的速度
jpg_dir = os.path.join('..', 'data', '2008_000008.jpg')
png_dir = os.path.join('..', 'data', '2008_000008.png')
t_jpg_cv = time.time()
for i in range(100):
img = cv2.imread(jpg_dir) # 默认np.dtype=uint8
print(f"opencv读取jpg图片100次用时:time.time()-t_jpg_cv:.5fs")
t_jpg_pil = time.time()
for i in range(100):
img = np.asarray(Image.open(jpg_dir), dtype=np.uint8) # Image读取的图片不是np.ndarray,需要转换
print(f"PIL读取jpg图片100次用时:time.time() - t_jpg_pil:.5fs")
t_png_cv = time.time()
for i in range(100):
img = cv2.imread(png_dir)
print(f"opencv读取png图片100次用时:time.time() - t_png_cv:.5fs")
t_png_pil = time.time()
for i in range(100):
img = np.asarray(Image.open(png_dir)) # Image读取的图片不是np.ndarray,需要转换
print(f"PIL读取png图片100次用时:time.time() - t_png_pil:.5fs")
结果:
因此,结论是,对于将图像(不论是jpg还是png格式)以np.ndarray()方式读入内存,PIL在速度上比opencv更高效。 因此我之后会选用PIL读取图片。
另外,我之前在有的博客里看到有人说PIL读取不如opencv高效,可我实验证明貌似不是这样的。但也有可能是我有些地方考虑不周,希望不吝赐教。
以上是关于opencv和PIL读取图片的速度对比的主要内容,如果未能解决你的问题,请参考以下文章
为啥用Python的openCV读取图片与PIL读取的图片像素值会不一样?
opencv-PIL-matplotlib-Skimage-Pytorch图片读取区别与联系
PIL.Image.open 与 cv2.imread 读取的图片在像素点上不一致