首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何在枕头(python)中加速图像加载?

如何在枕头(python)中加速图像加载?
EN

Stack Overflow用户
提问于 2019-08-26 19:20:27
回答 1查看 10.4K关注 0票数 7

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

我从未使用过python映像库,希望得到所有建议。

代码语言:javascript
运行
复制
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)

期望加载时间:<50,实际加载时间:~150

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-08-29 21:22:46

最新答案

自从我写了这个答案后,John (“pyvips”的作者)提出了一些改进和修正,以及更公平的代码和时间安排,并有了友好的在这里分享。请看他的改进版本,同时,甚至优先于我下面的代码。

原始答案

JPEG库具有“在加载中收缩”的特性,可以避免大量的I/O和解压缩。您可以在使用Image.draft()函数的PIL/Pillow中利用这一点,因此,您不必像下面这样读取完整的4032x3024像素:

代码语言:javascript
运行
复制
from PIL import Image

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

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

代码语言:javascript
运行
复制
im = Image.open('image.jpg') 
im.draft('RGB',(1008,756)) 
px = im.load()

这只需要75毫秒,也就是快了4倍。

只是为了刺激,我试着比较各种技术,如下所示:

代码语言:javascript
运行
复制
#!/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中并进行了如下测试:

代码语言:javascript
运行
复制
%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,枕头,图像,图像处理,,压缩加载,压缩加载,草稿模式,读取性能,加速.

票数 23
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57663734

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档