【发布时间】:2018-06-27 09:52:59
【问题描述】:
我想从一个无法一次全部加载到内存中的非常大的 h5py 数据集创建一个 png 或 tiff 图像文件。所以,我想知道 python 中是否有办法以补丁的形式写入 png 或 tiff 文件? (我可以将 h5py 数据集分片加载到numpy.ndarray)。
我尝试过使用枕头库并使用PIL.Image.paste 给出框坐标,但对于大图像,它会耗尽内存。
基本上,我想知道是否有办法做类似的事情:
for y in range(0, height, patch_size):
for x in range(0, width, patch_size):
y2 = min(y + patch_size, height)
x2 = min(x + patch_size, width)
# image_arr is an h5py dataset that cannot be loaded completely
# in memory, so load it in slices
image_file.write(image_arr[y:y2, x:x2], box=(y, x, y2, x2))
我正在寻找一种方法来做到这一点,而无需将整个图像加载到内存中。我已经尝试过枕头库,但它会将所有数据加载/保存在内存中。
编辑:这个问题与 h5py 无关,而是我们如何将超大图像(无法加载到内存中)以补丁的形式写入文件 - 类似于如何通过写入行来构造大型文本文件按行。
【问题讨论】:
-
tifffile.memmap为您提供存储在 TIFF 文件中的内存映射 numpy 数组。不过没有压缩或平铺。 -
你能不能创建一堆单独的相对较小的 png/tiff 图像,然后将它们组合成一个大的图像?
-
投票结束。 Does h5py read the whole file into memory? 的可能重复项
-
刺客:图像太大而无法记忆有什么好处?无论如何,我怀疑您可以通过尝试将一堆图像以这两种压缩格式中的任何一种组合在一起来实现这一点。如果相反,如果未压缩(或仅限于面向行的压缩,如 RLE),则可以通过仅在任何给定时间打开包含相同行的行的行来最小化组合它们时的内存使用量最终图像。这将允许将最终图像的线条连接在一起,而无需一次将所有线条全部读入内存。
-
我也看不出单张图片太大而无法放入内存的意义。你将如何渲染它?对于地图之类的东西,您在概念上会拥有一张大图像,实际上它们被分解成图块并按需提供。如果您的问题不是特定于 HDF5,那么它似乎与这个问题重复:stackoverflow.com/questions/31806526/…
标签: python python-imaging-library pillow