在OpenCV Python中更快地调整图像大小

Sre*_* TP 4 python opencv image-processing

我的文件夹(5M +)中有很多图像文件。这些图像大小不同。我想将这些图像调整为128x128

我在循环中使用以下函数在Python中使用OpenCV调整大小

def read_image(img_path):
    # print(img_path)
    img = cv2.imread(img_path)
    img = cv2.resize(img, (128, 128))
    return img

for file in tqdm(glob.glob('train-images//*.jpg')):
    img = read_image(file)
    img = cv2.imwrite(file, img)
Run Code Online (Sandbox Code Playgroud)

但是,这将需要7个多小时才能完成。我想知道是否有任何方法可以加快此过程。

我可以实现并行处理以有效地做到这dask一点吗?如果是这样,怎么可能。

Mar*_*ell 5

如果您绝对打算在Python中执行此操作,请忽略我的回答。如果您对简单快速地完成工作感兴趣,请继续阅读...

我建议您使用GNU Parallel,如果您有很多事情要做并行处理甚至更多,那么随着CPU成为具有更多内核的“笨拙”而不是具有更高时钟频率(GHz)的“更复杂

最简单的说,您可以在Linux,macOS和Windows的命令行中使用ImageMagick来调整图像大小:

magick mogrify -resize 128x128\! *.jpg
Run Code Online (Sandbox Code Playgroud)

如果您有数百张图像,则最好并行运行:

parallel magick mogrify -resize 128x128\! ::: *.jpg
Run Code Online (Sandbox Code Playgroud)

如果您有数百万个图像,则的扩展*.jpg将溢出Shell的命令缓冲区,因此您可以使用以下命令将图像名称输入on stdin而不是将其作为参数传递:

find -iname \*.jpg -print0 | parallel -0 -X --eta magick mogrify -resize 128x128\!
Run Code Online (Sandbox Code Playgroud)

这里有两个“技巧”

  • 我使用find ... -print0parallel -0来终止文件名,因此它们之间没有空格问题,

  • 我用的parallel -X是,GNU Parallel不会mogrify为每个图像启动一个全新的过程,而是会计算出mogrify可以接受的文件名数量,并成批分配给它。

我向您推荐这两种工具。


尽管上述答案的ImageMagick方面在Windows上都可以运行,但我不使用Windows,也不确定在那里使用GNU Parallel。我认为它可能在git-bash和/或在下面运行Cygwin-您可以尝试提出一个单独的问题-它们是免费的!

关于ImageMagick部分,我认为您可以使用以下命令获得文件中所有JPEG文件名的列表:

DIR /S /B *.JPG > filenames.txt
Run Code Online (Sandbox Code Playgroud)

然后,您可以或许处理它们(不平行)是这样的:

magick mogrify -resize 128x128\! @filenames.txt
Run Code Online (Sandbox Code Playgroud)

如果你找到了如何运行GNU并行在Windows上,你可以很可能使用这样的事情处理它们并行:

parallel --eta -a filenames.txt magick mogrify -resize 128x128\!
Run Code Online (Sandbox Code Playgroud)