使用 PIL 进行批量图像处理?

0 python automation python-imaging-library

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

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

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

Mar*_*ell 6

一般来说,在处理对内存要求很高的图像时,将数千张图像批量加载到内存中,然后处理它们,然后将它们全部写出并不是最好的主意,因为您对计算机的 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)
Run Code Online (Sandbox Code Playgroud)

另外,如果你对大量图像进行相同的处理,那么使用 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)
Run Code Online (Sandbox Code Playgroud)

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

mkdir -p OUTPUT
magick mogrify -path OUTPUT -auto-level *.jpg
Run Code Online (Sandbox Code Playgroud)