从文件夹中的图像序列获取 numpy 数组

Asm*_*oni 2 python numpy image-processing python-imaging-library keras

我有一个文件夹,里面video1有一堆按顺序排列的图像frame_00.png, frame_01.png, ...

我想要的是格式为 4D numpy 数组(number of frames, w, h, 3)

这就是我所做的,但我认为它很慢,有没有更快或更有效的方法来实现同样的事情?

folder = "video1/"

import os
images = sorted(os.listdir(folder)) #["frame_00", "frame_01", "frame_02", ...]

from PIL import Image 
import numpy as np 

video_array = []
for image in images:
    im = Image.open(folder + image)
    video_array.append(np.asarray(im)) #.transpose(1, 0, 2))

video_array = np.array(video_array)
print(video_array.shape)
#(75, 50, 100, 3)
Run Code Online (Sandbox Code Playgroud)

tel*_*tel 5

有一个较旧的 SO 线程详细介绍了这个主题(甚至可能有点太多)。我不会投票结束这个问题,我将快速概述该线程的主要要点:

  • 最快的常用图像读取功能imread来自该cv2软件包。
  • 读取图像然后将它们添加到普通的 Python 列表中(正如您已经在做的那样)是读取大量图像的最快方法。
  • 但是,考虑到您最终要将图像列表转换为图像数组,构建图像数组的每种可能的方法几乎与任何其他方法一样快
    • 有趣的是,如果您采用将图像直接分配给预分配数组的方法,那么实际上分配给哪些索引(即哪个维度)对于获得最佳性能很重要。

所以基本上,在纯单线程 Python 中工作时,你将无法获得更快的速度。cv2.imread您可能会因切换到(代替)而获得提升PIL.Image.open