【问题标题】:Batch image manipulation with PIL?使用 PIL 进行批量图像处理?
【发布时间】:2021-02-20 20:09:04
【问题描述】:

我刚刚在做一个项目时遇到了 pythons PIL 库,对此非常陌生。

我的简单程序从目录导入一张图片,使用 PIL 应用所需的操作,然后将其保存到不同的文件夹中。

我的问题 - 我可以批量导入包含多个图像的目录并在 PIL 中对该目录中的所有图像运行所需的操作吗?

【问题讨论】:

标签: python automation python-imaging-library


【解决方案1】:

一般来说,当处理通常对内存要求很高的图像时,最好将数千张图像批量加载到内存中,然后将它们全部处理,然后再将它们全部写出来,因为你会产生巨大的内存需求您计算机的 RAM 可能会减慢它的速度。这导致代码更像这样:

#!/usr/bin/env python3

import glob
from PIL import Image

def ProcessOne(f):
   print(f'Opening {f}')
   im = Image.open(f)
   ... process ...
   ... process ...

if __name__ == '__main__':

   # Create a list of files to process
   files = [f for f in glob.glob("*.jpg")]

   for f in files:
       ProcessOne(f)

另外,如果您对大量图像进行相同的处理,那么使用 Python 的 multiprocessing 模块通常是一个合理的想法,因为 Python 本身不会使用您支付的所有那些可爱的 CPU 内核英特尔如此出色,这是一个认真的考虑,因为 CPU 继续变得更胖(更多内核)而不是更高(更多 GHz)。这导致代码更像这个示例,几乎不再难以编写或阅读:

#!/usr/bin/env python3

import glob
from multiprocessing import Pool
from PIL import Image

def ProcessOne(f):
    im = Image.open(f)
    ... process ...


if __name__ == '__main__':
    # Create a pool of processes to check files
    p = Pool()

    # Create a list of files to process
    files = [f for f in glob.glob("*.jpg")]

    print(f'Files to process: {len(files)}')

    # Map the list of files to check onto the Pool
    p.map(ProcessOne, files)

还请注意,您可以使用 ImageMagick 简单地处理数百个文件并将结果写入不同的目录。因此,假设您想标准化整个 JPEG 目录的亮度级别并将修改后的文件写入名为 OUTPUT 的目录中,您可以在终端中执行此操作:

mkdir -p OUTPUT
magick mogrify -path OUTPUT -auto-level *.jpg

【讨论】:

  • 太邪恶了,谢谢!这是迄今为止在尝试实现上述多处理等之前的脚本,因为我有点初学者:github.com/krsdesgin/crop-app
  • 所以,使用 ImageMagick,你会想要magick mogrify -crop 1070x1080+10+610 -path OUTPUT *.png
  • 您可以使用brew install imagemagick 使用 homebrew 在 Mac 上最简单地安装 ImageMagick
  • Python 不会使用你花大价钱买给 Intel 的那些可爱的 CPU 内核。 在谈论这个问题时,这应该是强制性的措辞!可爱!
猜你喜欢
  • 1970-01-01
  • 2012-02-24
  • 2019-05-26
  • 2020-01-31
  • 2011-02-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多