繁体   English   中英

使用HDF5和cPickle保存图像比直接将相同数量的图像文件直接存储在磁盘中要多得多。

[英]Saving images with HDF5 and cPickle cost much more disk memory than just storing the same amount of image files directly in disk?

我正在尝试保存大量图像。 我想将它们保存为一种格式,该格式会占用尽可能少的磁盘内存。 我已经在python中使用HDF5和cPickle进行了测试。 令人惊讶的是,我发现PyTables和cPickle生成的数据文件的大小比包含相同数量图像的文件夹大得多。

我的代码在这里:

import cv2
import copy
import cPickle as pickle
import tables
import numpy as np
image = cv2.imread("aloel.jpg")
images = []
for i in xrange(1000):
    images.append(copy.deepcopy(image))
images = np.asarray(images, dtype=np.uint8)
hdf5_path = "img.hdf5"
filters = tables.Filters(complevel=5, complib='blosc')
with tables.open_file(hdf5_path, mode='w', filters=filters) as hdf5_file:
    data_storage = hdf5_file.create_array(hdf5_file.root, 'data', obj=images)

with open('img.pickle', 'wb') as f:
    pickle.dump(images, f, protocol=pickle.HIGHEST_PROTOCOL)

包含1000个aloel.jpg副本的文件夹占用61.5 MB的空间 ,但是img.hdf5img.pickle的大小均为1.3GB

我不知道为什么会这样? 如果是这种情况,是否意味着将图像数据直接保存到单个图像文件中而不是将它们保存到pickle文件或hdf5文件中会更好?

更新:您的问题是根本不应用压缩,因为首先您需要进行分块,这可以通过将“ create_array”替换为“ create_carray”来实现。 然后,在complevel 5上应用“ zlib”,您应该已经看到了一些改进。 当然,对于这种特殊情况,也可以沿重复的数据轴设置分块,因此,如果在create_carray命令中添加诸如chunkshape=[100,100,100,3]之类的内容,应该会看到一个重大变化。

Jpeg是高效的有损压缩算法。 Blosc已针对速度进行了优化,并且默认情况下不对pickle进行压缩。 HDF5还有其他选项,请查看https://support.hdfgroup.org/services/filters.html ,我相信您可以找到一种与原始jpeg足够接近的方法。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM