python-3.x - 加快 OpenCV 与 Pillow 中图像的加载速度
问题描述
在我的测试 python 应用程序中,我有一个非常标准的 JPEG 文件 1500 x 800 作为 buffer 加载到内存中buf
。该缓冲区需要被解码为图像对象,以便我可以在 OpenCV 中使用它。
我知道两种解决方案:
- 枕头或枕头-SIMD:
from PIL import Image
from io import BytesIO
image = Image.open(BytesIO(buf))
- 开放式简历:
import cv2
import numpy as np
np_buffer = np.frombuffer(buf, np.uint8)
image = cv2.imdecode(np_buffer, 128 | 1)
现在,我面临的问题是性能。平均而言,使用 Pillow 加载图像需要0.1毫秒,使用 OpenCV 加载图像需要 30 毫秒。
当然,将 Pillow 图像对象转换为 OpenCV 格式(numpy 数组)会产生额外的开销,但是,有什么办法可以加快 OpenCV 中图像缓冲区的加载和解码速度?
我在用:
Python 3.8.5
Pillow-SIMD 7.0.0.post3
opencv-python 4.4.0.44
numpy 1.19.2
解决方案
用枕头代替这个
from PIL import Image
from io import BytesIO
image = Image.open(BytesIO(buf))
用这个
from PIL import Image
from io import BytesIO
import numpy as np
image = Image.open(BytesIO(buf))
arr = np.array(image, dtype=np.uint8)
那么这将是一个失败的比较,因为枕头 Image.open 不会访问像素值。仅当您尝试绘制图像或将其转换为数组时才会这样做。
推荐阅读
- ruby - 未定义方法“发票”Ruby on Rails 的问题
- angular - 在 Angular 中显示/隐藏子组件的推荐方法是什么?
- java - 如何打印线性搜索后找到元素的索引?爪哇
- python - 如果提供换行符,则不(或不正确)包装文本
- azure-devops - Azure DevOps:错误消息服务挂钩服务无法将通知发送到目标使用者
- cmake - CMAKE:强制如果文件存在则它是最新的(在构建时)
- python - Python解释器在使用线程回调时崩溃
- javascript - setTimeout 内 useEffect 和 useState
- javascript - 如何在模块导出 ReactJs 上导出 Axios 响应
- r - (函数(类,fdef,mtable)中的错误:无法找到签名“缺失”的函数“windows”的继承方法