我最近一直在玩延时摄影,并在一组图像上使用中值图像堆叠,或者提取视频帧。我已经创建了一个与相对较少的图像配合良好的小脚本:
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内存。我尝试了一些方法,包括将图像数据分成块并一次计算一个块的中值,并按颜色通道分割图像数据,但是当要处理的图像数量很多时,需要保存的文件调用量按图像到磁盘映像的数据会导致大幅减速。
我想知道是否有任何方法可以使用一些加权方案一次计算几张图像的中位数,然后重复结果,或使用虚拟内存,内存映射文件或其他内容的噱头消除这种过多的内存使用。有什么想法吗?
答案 0 :(得分:0)
如何使用Python的HDF5接口 http://www.h5py.org/? HDF5是一种用于处理大量网格化数据集的数据格式,使用h5py,您可以使用NumPy操作该数据。 NetCDF也很好,并集成了HDF5。
图像的分辨率是多少,有多少分辨率?
以下是您的问题的解决方案,该解决方案使用netCDF4切出一组图像的(400,400)个区域,将它们添加到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')