如何在枕头(python)中加快图像加载速度



我想使用枕头进行一些简单的手写图像识别,这将是实时的,所以我需要每秒调用我的函数 5-10 次。我正在加载图像,并且只访问 1/20^2 像素,所以我真的不需要所有图像。我需要减少图像加载时间。

我从未使用过python图像库,并将不胜感激所有建议。

from PIL import Image
import time
start = time.time()
im = Image.open('ir/IMG-1949.JPG')
width, height = im.size
px = im.load()
print("loading: ", time.time() - start)

所需加载时间:<50ms, 实际加载时间:~150ms

更新的答案

自从我写了这个答案以来,John Cupitt(pyvips的作者)提出了一些改进和更正以及更公平的代码和时间安排,并在这里分享了它们。请查看他的改进版本,以及甚至更喜欢下面的代码。

原始答案

JPEG库具有"加载时收缩">功能,可以避免大量的I/O和解压缩。您可以使用 PIL/Pillow 使用Image.draft()功能利用这一点,因此无需像这样读取完整的 4032x3024 像素:

from PIL import Image
im = Image.open('image.jpg')
px = im.load() 

在我的Mac上需要297ms,您可以执行以下操作并读取1008x756像素,即宽度的1/4和高度的1/4:

im = Image.open('image.jpg') 
im.draft('RGB',(1008,756)) 
px = im.load()

这只需要 75 毫秒,即速度快 4 倍。


只是为了踢球,我尝试比较各种技术,如下所示:

#!/usr/bin/env python3 
import numpy as np 
import pyvips 
import cv2 
from PIL import Image 
def usingPIL(f): 
im = Image.open(f) 
return np.asarray(im) 
def usingOpenCV(f): 
arr = cv2.imread(f,cv2.IMREAD_UNCHANGED) 
return arr 
def usingVIPS(f): 
image = pyvips.Image.new_from_file(f, access="sequential") 
mem_img = image.write_to_memory() 
imgnp=np.frombuffer(mem_img, dtype=np.uint8).reshape(image.height, image.width, 3)  
return imgnp 
def usingPILandShrink(f): 
im = Image.open(f)  
im.draft('RGB',(1008,756))  
return np.asarray(im) 
def usingVIPSandShrink(f): 
image = pyvips.Image.new_from_file(f, access="sequential", shrink=4) 
mem_img = image.write_to_memory() 
imgnp=np.frombuffer(mem_img, dtype=np.uint8).reshape(image.height, image.width, 3)  
return imgnp 

并将其加载到ipython中并像这样进行测试:

%timeit usingPIL('image.jpg')
315 ms ± 8.76 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
%timeit usingOpenCV('image.jpg')
102 ms ± 1.5 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)
%timeit usingVIPS('image.jpg')
69.1 ms ± 31.3 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
%timeit usingPILandShrink('image.jpg')
77.2 ms ± 994 µs per loop (mean ± std. dev. of 7 runs, 10 loops each)
%timeit usingVIPSandShrink('image.jpg')                                                    
42.9 ms ± 332 µs per loop (mean ± std. dev. of 7 runs, 10 loops each)

似乎pyVIPS是这里的明显赢家!

关键词:Python,PIL,枕头,图像,图像处理,JPEG,加载时收缩,加载时收缩,草稿模式,读取性能,加速。

最新更新