在python库中导入和裁剪jpeg的快速方法

2024-06-16 08:26:10 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个python应用程序,它可以导入200k+个图像,并将裁剪后的图像呈现给pyzbar以解释条形码。裁剪是有帮助的,因为图像上有多个条形码,而且,假设pyzbar在给定较小图像时速度会更快一些。在

目前我正在使用枕头导入和裁剪图像。在

平均来说,导入和裁剪图像需要262毫秒,pyzbar需要8毫秒。在

一次典型的跑步时间约为21小时。在

我想知道除了枕头以外的图书馆是否可以在装载/裁剪方面提供实质性的改进。理想情况下,这个库应该可以在MacOS上使用,但是我也可以在一个虚拟的Ubuntu机器上运行整个程序。在

我正在开发一个可以在并行进程中运行的版本,这将是一个很大的改进,但如果我可以从另一个库获得25%或更多的速度提升,我也会添加这一点。在


Tags: 图像应用程序图书馆时间情况macos跑步速度
2条回答

由于您没有提供示例图像,所以我制作了一个虚拟文件,其尺寸为2544x4200,大小为1.1MB,并在答案的末尾提供。我复制了1000张图片,并为每个基准处理了1000张图片。在

因为你只在评论区给出你的代码,所以我把它拿走,格式化,并尽我所能做到最好。我还将它放在一个循环中,这样它就可以处理许多文件,只需调用Python解释器一次——当您有20000个文件时,这一点就变得很重要了。在

看起来像这样:

#!/usr/bin/env python3

import sys
from PIL import Image

# Process all input files so we only incur Python startup overhead once
for filename in sys.argv[1:]:
   print(f'Processing: {filename}')
   imgc = Image.open(filename).crop((0, 150, 270, 1050))

我的怀疑是我可以更快地使用:

  • GNU并行,和/或
  • 皮维普斯

以下是您的代码的pyvips版本:

^{pr2}$

结果如下:

顺序原始码

./orig.py bc*jpg
224 seconds, i.e. 224 ms per image, same as you

并行原始代码

parallel ./orig.py ::: bc*jpg
55 seconds

并行原始代码,但传递尽可能多的文件名

parallel -X ./orig.py ::: bc*jpg
42 seconds   

顺序pyvips

./vipsversion bc*
30 seconds, i.e. 7x as fast as PIL which was 224 seconds

并行pyvips

parallel ./vipsversion ::: bc*
32 seconds

并行pyvips,但传递尽可能多的文件名

parallel -X ./vipsversion ::: bc*
5.2 seconds, i.e. this is the way to go :-)

enter image description here


请注意,您可以使用自制的在macOS上安装GNU Parallel

brew install parallel

您可以看看PyTurboJPEG,它是一个libjpeg-turbo的Python包装器,在解码大JPEG图像时,它具有惊人的快速重新缩放(1/2、1/4、1/8),返回努比·恩达雷方便图像裁剪。另外,JPEG图像编码速度也很快。在

from turbojpeg import TurboJPEG

# specifying library path explicitly
# jpeg = TurboJPEG(r'D:\turbojpeg.dll')
# jpeg = TurboJPEG('/usr/lib64/libturbojpeg.so')
# jpeg = TurboJPEG('/usr/local/lib/libturbojpeg.dylib')

# using default library installation
jpeg = TurboJPEG()

# direct rescaling 1/2 while decoding input.jpg to BGR array
in_file = open('input.jpg', 'rb')
bgr_array_half = jpeg.decode(in_file.read(), scaling_factor=(1, 2))
in_file.close()

# encoding BGR array to output.jpg with default settings.
out_file = open('output.jpg', 'wb')
out_file.write(jpeg.encode(bgr_array))
out_file.close()

还提供了libjpeg turbo预构建的macOS和Linux二进制文件here。在

相关问题 更多 >