【opencv和PIL读取图片的速度对比】

目录

  • 0. 应用场景
  • 1. 代码检测

0. 应用场景

在Pytorch代码中,我们构建Dataset类时在‘getitem’方法中需要有读取数据的操作,而模型训练和预测过程中,数据的读取会占用一部分时间。何况数据集中有成千上万张图像,因此读取速度的快慢会影响模型训练和预测时的效率。

在代码中有两种常见的图片数据读取方式:opencv和PIL的Image读取。而opencv读取的数据直接是np.ndarray类型的,而PIL读取的数据是Image的class,还需要np.asarray()转换才行。

下面来检测下两者的读取速度差异:

1. 代码检测

分别读取同样尺寸(500x442)的jpg和png图像100次,如下:
【opencv和PIL读取图片的速度对比】_第1张图片
【opencv和PIL读取图片的速度对比】_第2张图片

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")

结果:
【opencv和PIL读取图片的速度对比】_第3张图片
因此,结论是,对于将图像(不论是jpg还是png格式)以np.ndarray()方式读入内存,PIL在速度上比opencv更高效。 因此我之后会选用PIL读取图片。

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

你可能感兴趣的:(深度学习,opencv,计算机视觉,python,PIL)