如何加快枕头中的图像加载(python)?

时间:2019-08-26 19:20:27

标签: python image python-imaging-library

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

我从未使用过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

1 个答案:

答案 0 :(得分:5)

JPEG库具有“加载时收缩” 功能,该功能可以避免很多I / O和解压缩。您可以使用Image.draft()函数在PIL / Pillow中利用此功能,而不是像这样读取4032x3024像素:

from PIL import Image

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

在我的Mac上需要297毫秒,您可以执行以下操作并读取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) 
    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) 

并将其加载到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')
8.44 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)

pyVIPS 显然是这里的赢家!

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