【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:.5f}s")

    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:.5f}s")

    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:.5f}s")

    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:.5f}s")

结果:
在这里插入图片描述
因此,结论是,对于将图像(不论是jpg还是png格式)以np.ndarray()方式读入内存,PIL在速度上比opencv更高效。 因此我之后会选用PIL读取图片。

另外,我之前在有的博客里看到有人说PIL读取不如opencv高效,可我实验证明貌似不是这样的。但也有可能是我有些地方考虑不周,希望不吝赐教。

猜你喜欢

转载自blog.csdn.net/qq_44166630/article/details/127153615