2017-06-14 69 views
0

我想保存大量的圖像。我想將它們保存爲儘可能減少磁盤內存的格式。我已經用python測試過HDF5和cPickle。令人驚訝的是,我發現由PyTables和cPickle生成的數據文件比包含相同數量圖像的文件夾大得多。使用HDF5和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) 

包含的aloel.jpg 1000個拷貝的文件夾佔用61.5 MB,但img.hdf5img.pickle的大小都1.3GB

我想知道爲什麼會出現這種情況?如果是這樣,是否意味着將圖像數據直接保存到單個圖像文件中而不是將其保存到pickle文件或hdf5文件中會更好?

+1

BLOSC是無損壓縮,所以它並不讓我感到驚訝,文件的大小更大。因爲它存儲元數據信息,所以HDF5總是會更大一些。 HDF5的主要優勢是存儲結構化數據,而不是磁盤空間。 – user1767754

+0

jpg格式已經是一個有損壓縮文件。除非你願意失去更多的信息,否則難以縮小它們的尺寸。 –

+1

您可以將jpeg圖像存儲爲二進制文件,而不是將它們作爲表格寫入。 – user1767754

回答

0

更新: 你的問題是壓縮並沒有被應用,因爲首先你需要分塊,這可以通過將「create_array」替換爲「create_carray」來實現。然後,將「zlib」與complevel 5結合使用,您應該已經看到了一些改進。對於這種特殊情況,當然,也可以沿重複的數據軸設置分塊,因此如果在create_carray命令中添加類似chunkshape=[100,100,100,3]的東西,則應該看到一個重大更改。

Jpeg是高效的有損壓縮算法。 Blosc針對速度進行了優化,默認情況下泡菜根本沒有壓縮。 HDF5還有其他選擇,請看https://support.hdfgroup.org/services/filters.html,我相信你可以找到足夠接近原始jpeg的方法。

+0

他仍然可以在HDF5數據樹中使用JPEG壓縮,但他將它們存儲爲表並將它們BLOSC'ing。我不認爲你可以通過將圖像轉換成表格並應用基於文本的壓縮來實現更好的壓縮。 – user1767754