gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-28 22:09:27 25 4
gpt4 key购买 nike

我想使用 pillow 进行一些简单的手写图像识别,它是实时的,所以我需要每秒调用我的函数 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

最佳答案

更新的答案

自从我写下这个答案后,John Cupitt(pyvips 的作者)提出了一些改进和更正以及更公平的代码和时间安排,并亲切地 shared them here .请查看他的改进版本,以及我下面的代码,甚至优先于我的代码。

原始答案

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, 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、Pillow、图像、图像处理、JPEG、加载时收缩、加载时收缩、草稿模式、读取性能、加速。

关于python - 如何加快枕头(python)中的图像加载?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57663734/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com