将jpg数据存储在字典中?

时间:2013-12-05 16:10:36

标签: python image data-structures

我有一台相机每分钟记录两张图像,每天产生2880张图像,大约180kb /张。在几个月的时间内,这增加了许多图像,这使得传输数据变得麻烦。为了解决这个问题,我将图像转换为每月tar文件(例如201301.tar,201302.tar)。我在分析工作中使用图像,所以我确实需要访问数据,我遇到了两个问题:

  1. 要加载一个单独的jpg,我需要解开月份的图片(我希望避免在去掉皮重的时间)
  2. 当我需要阅读几天的数据时,阅读单个jpg的速度很慢。
  3. 是否有将图像数据存储在单个文件中的实用方法(我更有可能会逐月存储数据)?我认为存储为字典(key = datetime值,value = array(size = 480 x 660 x 3))是有道理的,但我在重新加载数据时遇到了问题。

    # Example
    import datetime as dt
    from scipy.misc import imread as ir
    
    dts = dt.datetime.strptime
    
    image = ir('skycam-current.jpg',flatten=False)
    
    data = {}
    data[dt.datetime(2013,01,01)] = image
    np.savez('test.dic.npz',data)
    
    # Then, to re-load the data
    data = np.load('test.dic.npz')
    

    当我重新加载数据时,我得到一本字典,有点:

    >>> type(data)
    >>> numpy.lib.npyio.NpzFile
    
    >>> data.keys()
    >>> ['arr_0']
    

    如果我尝试恢复字典,我会得到一个0-d数组

    >>> a = data['arr_0']
    >>> a.shape
    >>> ()
    

    有人可以推荐一种更好的存储字典或存储图像数据的方法吗?我一直在使用pandas进行分析/存储,但它似乎不是为存储数组而构建的。

2 个答案:

答案 0 :(得分:2)

如果它已经被jpeg压缩,那么通过进一步压缩它并不会真正获得太大的空间优势。您是将这些放入tar档案以试图节省空间,还是因为目录需要人类可读?如果目录不需要是人类可读的,那么归档并没有太多优势,只需将每个月存储在一个单独的文件夹中,并使用sqlite数据库或文件/文件夹名称中的某些逻辑来保持跟踪他们。

答案 1 :(得分:1)

tar文件是存储不可压缩文件的好方法,比如jpgs。它比使用zip更好,因为你没有de / compress开销,并且可能比使用文件系统更好,因为你生成了很多文件。将文件存储在RAM中意味着您必须拥有专用于该任务的大量内存,这使得在机器之间访问和传输数据变得更加困难。

tar文件的一个大问题是它们don't allow random access,因为它们没有像zip文件那样编入索引。这意味着,要从存档中间提取文件,您必须阅读整个存档,直到找到该文件。

要解决此限制,有几个人已经构建了tar文件索引器,它们将偏移存储到存档中的文件中,以便您可以直接读取它们。其中一个项目是tarindexer,可以用python方便地编写,因此您可以轻松地将其用作库。它只有100行,所以它也很容易理解和适应。