在OpenCV中加速加载图像vs Pillow

lzfw57am  于 12个月前  发布在  其他
关注(0)|答案(1)|浏览(101)

在我的测试python应用程序中,我有一个相当标准的JPEG文件1500 x 800作为缓冲区buf加载到内存中。该缓冲区需要解码为图像对象,以便我可以在OpenCV中使用它。
我知道两个解决办法:
1.枕式或枕式SIMD:

from PIL import Image
from io import BytesIO

image = Image.open(BytesIO(buf))

字符串

  1. OpenCV:
import cv2
import numpy as np

np_buffer = np.frombuffer(buf, np.uint8)
image = cv2.imdecode(np_buffer, 128 | 1)


现在我面临的问题是性能,Pillow加载图片平均需要0.1ms,OpenCV加载需要30ms
当然,将Pillow图像对象转换为OpenCV格式(numpy数组)会有额外的开销,但仍然有什么可以做的来加速OpenCV中的图像缓冲区的加载和解码?
我正在使用:

Python 3.8.5
Pillow-SIMD 7.0.0.post3
opencv-python 4.4.0.44
numpy 1.19.2

s4n0splo

s4n0splo1#

枕头而不是这个

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)


这样比较就公平了,因为pillow Image.open不会访问像素值,只有当你试图绘制图像或将其转换为数组时才会访问。这应该与你的opencv代码相当。

相关问题