【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高效,可我实验证明貌似不是这样的。但也有可能是我有些地方考虑不周,希望不吝赐教。

  • 4
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

SinHao22

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值