2

我有一台相机,可以拍摄高分辨率图像并将它们存储为大矩阵。我正在尝试从数据中构建图像。(并且必须在 Python-32 位中完成。)

数据保存在 HDF5 中,我使用 h5py 访问它,但我无法在没有内存错误的情况下绘制数据,因为我知道的所有方法都需要将所有数据转储到计算机的内存中。(我只熟悉常用的 matplotlib 和 scipy 库。)

另外,当我尝试从数据中生成图像时,我遇到了同样的问题,但是在我之前提出的问题(在 Python 中构建高分辨率图像)中,有人告诉我 GDAL 能够从数据中生成图像。

我做了一些研究(似乎 GDAL for python 没有很好的文档记录)并遇到了这个问题:你可以在不加载整个图像的情况下遍历图像中的像素吗?. 提供的答案提供了一个快速脚本,可以逐行导入图像。有没有办法与此相反并逐行保存图像?这样我就不必将所有数据加载到内存中来保存图像。

或者是否有一种方法可以从 HDF5 数据集生成图像(最好是 PNG),该数据集太大而无法加载到内存中?

这是我一直在使用的一些示例代码:

import tables
import Image
import matplotlib.pyplot as plt
import scipy.misc

data = numpy.random.random_integers(0, 262143, (10000, 10000))

fileName = "array1.h5"
h5f = tables.openFile(fileName, "w")
array = h5f.createArray(h5f.root, "array1", data)
h5f.close()


fileName = "array1.h5"
h5f = tables.openFile(fileName, "r")
array_read = h5f.root.array1
print array_read[:]

#Method 1
scipy.misc.imsave('Test_random.png', array_read[:])

#Method 2
plt.imshow(array_read[:])
plt.show()

#Method 3
plt.pcolormesh(array_read[:])
plt.show()

它生成一个 10000x10000 的矩阵,并使用 h5py 将其保存在 H5 文件中。我关闭文件并重新打开它。然后我尝试保存图像或绘制数据(我注释掉了三种方法中的两种来测试每种方法)。

如果有人可以提供一些示例代码,允许我将存储在 H5 文件中的这个数组保存为 PNG 图像,我将不胜感激。

4

1 回答 1

0

许多图像格式都有严格的限制,即它们针对显示的 8 位 RGB(A) 颜色数据进行了优化。如果您的相机有更多有效位,您将需要不同的格式。除了 HDF5(正是为这种情况而设计的)之外,我只推荐 TIFF,因为它支持许多不同的像素格式,而且作为 BigTIFF 版本,甚至文件大小大于 4GB。TIFF 很普遍。

现在您说您无法在没有内存错误的情况下绘制数据。这(正如ali_m指出的那样)是一个独立于文件格式的问题。如果您无法将整个 10000x10000 像素的图像存储在内存中,则必须显示缩小的版本,或者只能显示缩放的部分,然后允许滚动到不同的部分,同时始终从磁盘加载文件的切片(这可能是不是很快)。

HDF5 允许精美的索引,因此您可以轻松地对图像的部分进行下采样(按整数)。然后操作系统可以缓冲文件访问并希望加快速度。

我不知道 hdf5 中有任何内置的缩减功能,但您可以使用scipyroutines自己添加(遇到内存问题时分块执行) 。

在 HDF5 中,您也可以以块的形式写入数据(同样通过强大的索引),这在保存“数据太大而无法存储”时也很重要。

TIFF 现在我不确定大多数(全部?)具有 tiff 功能的 Python 库使用的libtiff是否可以读取或写入 2D 图像切片。但我知道您可以以类似于 HDF5 的方式将多个图像放入一个 TIFF 文件 (MultiPageTiff)。因此,您可以将部分图像作为多个堆栈放入 TIFF 文件中。如何最好地管理它取决于您的应用程序。

最后,我强烈建议使用 HDF5 作为文件格式并使用 HDF5 的精美索引,围绕它构建一个查看器,可以缩放或下采样或将两者结合以向您显示数据。为了提高性能,我希望操作系统能够缓冲 HDF5 文件的部分内容,但是有一些内部参数(它们也使用块)可能会被调整以提高特定图像大小的效率。

提示:无需显示比实际显示器更好的像素化数据(缩放或不缩放)。

于 2015-12-21T21:48:30.410 回答