Python内存管理与中间图像堆叠器

Python内存管理与中间图像堆叠器,python,memory,python-3.x,Python,Memory,Python 3.x,我最近一直在玩延时摄影,在一组图像或提取的视频帧上使用中值图像叠加。我创建了一个小脚本,可以很好地处理相对较少的图像: from PIL import Image import os import numpy as np #Create a list of the images' data imglist = [] for fname in os.listdir("input\\"): imglist.append(np.array(Image.open("input\\"+fname)

我最近一直在玩延时摄影,在一组图像或提取的视频帧上使用中值图像叠加。我创建了一个小脚本,可以很好地处理相对较少的图像:

from PIL import Image
import os
import numpy as np
#Create a list of the images' data
imglist = []
for fname in os.listdir("input\\"):
    imglist.append(np.array(Image.open("input\\"+fname)))
#Find the median of all image data in the stack, save it
median = np.uint8(np.median(imglist, axis=0))
Image.fromarray(median).save("median.png","PNG")
这里明显的问题是,如果一次将太多的图像加载到内存中,它们会填满我微薄的8GB内存。我尝试过将图像数据分割成块并计算中间值的方法,以及按颜色通道分割图像数据,但当有那么多图像要处理时,将数据逐个图像保存到磁盘上所需的文件调用量会导致速度大幅降低

我想知道是否有任何方法可以使用某种加权方案一次计算几个图像的中值,然后重复计算结果,或者使用虚拟内存、内存映射文件或其他方法来消除这种过度的内存使用。有什么想法吗?

使用Python的HDF5接口怎么样?HDF5是一种用于处理海量网格数据集的数据格式,使用h5py,您可以使用NumPy操作该数据。NetCDF也很好,它集成了HDF5

图像的分辨率是什么,有多少

以下是您的问题的解决方案,它使用netCDF4对图像集合的(400400)区域进行切片,将其添加到netCDF文件中,并在最后取中值:

import glob
from netCDF4 import Dataset
import numpy as np
from PIL import Image

WIDTH = 800
HEIGHT = 450

root = Dataset('test.nc', 'w')

root.createDimension('x', WIDTH)
root.createDimension('y', HEIGHT)
root.createDimension('channels', 3)
t = root.createDimension('t', None)

img = root.createVariable('image', 'u1', ('t','y','x','channels'))

images = glob.glob('images/*')

for i,fname in enumerate(images):
    im = Image.open(fname)
    im_array  = np.asarray(im)
    img[i] = im_array

median = np.median(img, axis=0)
im = Image.fromarray(np.uint8(median))
im.save('out.png')

我现在正在看一个小时长的澳大利亚悉尼的网络摄像机录像。分离到其组成帧,记录代表分辨率为800x450的54000帧。HDF5可能会工作,但我看不到用它计算中间值的方法,尽管许多命令类似于numpy。我想我可以一次只做一个像素,这样就行了。我用它来取大量图像的中间值。NetCDF文件变大,但RAM使用率保持较低。有趣的技术,我很想看到你得到的结果。看。