核心外4D图像tif存储为hdf5 python

2024-10-08 19:18:55 发布

您现在位置:Python中文网/ 问答频道 /正文

我有27GB的2D tiff文件,它代表了3D图像的电影片段。我希望能够将这些数据切片,就像它是一个简单的numpy4d数组一样。看起来像磁盘阵列是一个很好的工具,可以在数组作为hdf5文件存储在内存中后,对其进行干净的操作。在

如果这些文件不能全部放入内存,如何将它们存储为hdf5文件。我不熟悉h5.py和数据库。在

谢谢。在


Tags: 文件工具数据内存py图像电影切片
1条回答
网友
1楼 · 发布于 2024-10-08 19:18:55

编辑:使用dask.arrayimread函数

dask 0.7.0起,您不需要在HDF5中存储图像。直接使用imread函数:

In [1]: from skimage.io import imread

In [2]: im = imread('foo.1.tiff')

In [3]: im.shape
Out[3]: (5, 5, 3)

In [4]: ls foo.*.tiff
foo.1.tiff  foo.2.tiff  foo.3.tiff  foo.4.tiff

In [5]: from dask.array.image import imread

In [6]: im = imread('foo.*.tiff')

In [7]: im.shape
Out[7]: (4, 5, 5, 3)

将图像存储到HDF5中的旧答案

数据摄取通常是最棘手的问题。磁盘阵列没有任何与图像文件的自动集成(尽管如果有足够的兴趣,这是非常可行的)幸运的是,将数据移动到h5py很容易,因为h5py支持numpy切片语法。在下面的示例中,我们将创建一个空的h5py数据集,然后在for循环中将四个小tiff文件存储到该数据集中。在

首先我们得到图像的文件名(请原谅玩具数据集)。我身边没有任何现实的东西。)

^{pr2}$

加载并检查样本图像

In [4]: from skimage.io import imread
In [5]: im = imread(filenames[0])  # a sample image
In [6]: im.shape  # tiny image
Out[6]: (5, 5, 3)
In [7]: im.dtype
Out[7]: dtype('int8')

现在我们将在该文件中生成一个HDF5文件和一个名为'/x'的HDF5数据集。在

In [8]: import h5py
In [9]: f = h5py.File('myfile.hdf5')  # make an hdf5 file
In [10]: out = f.require_dataset('/x', shape=(len(filenames), 5, 5, 3), dtype=im.dtype)

很好,现在我们可以一次一个地将图像插入到HDF5数据集中。在

In [11]: for i, fn in enumerate(filenames):
   ....:     im = imread(fn)
   ....:     out[i, :, :, :] = im

此时dask.array可以愉快地包装out

In [12]: import dask.array as da
In [13]: x = da.from_array(out, chunks=(1, 5, 5, 3))  # treat each image as a single chunk
In [14]: x[::2, :, :, 0].mean()
Out[14]: dask.array<x_3, shape=(), chunks=(), dtype=float64>

如果您希望看到更多对图像堆栈的本地支持,那么我建议您raise an issue。直接从tiff文件堆栈中使用dask.array而不需要经过HDF5,这将非常容易。在

相关问题 更多 >

    热门问题