如何逐行保存图像?

时间:2013-06-11 12:18:34

标签: python image matplotlib large-files h5py

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

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

此外,当我尝试从数据生成图像时,我遇到了同样的问题,但我被告知GDAL能够在上一个问题(Constructing high resolution images in Python)中根据数据生成图像。

我做了一些研究(似乎GDAL for python没有很好地记录)并遇到了这个问题:Can you loop through pixels in an image without loading the whole image?。提供的答案提供了一个快速脚本,可以逐行导入图像。有没有办法与此相反并逐行保存图像?然后我不必将所有数据加载到内存中以保存图像。

或者是否有一种从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图像,我将非常感激。

1 个答案:

答案 0 :(得分:0)

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

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

HDF5允许fancy indexing,因此您可以轻松地对图像的某些部分进行下采样(通过整数)。然后操作系统可以缓冲文件访问速度,并希望能够加快速度。

我不知道hdf5中有任何内置的缩减功能,但您可以使用scipy routines自己添加(在遇到内存问题时以块为单位)。

在HDF5中,您也可以以块的形式写入数据(再次通过强大的索引编写),这在保存“内存太大的数据”时也很重要。

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

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

提示:无需显示数据(缩放或不缩放),其像素化效果优于实际监视器。