使用h5py将光栅图像添加到HDF5文件

7

如果我问的问题比较基础,我很抱歉,因为我对Python和HDF5都比较新。我正在使用h5py、numpy和Python 2.7。我有来自各种文件的数据需要导入到一个HDF5文件中。每个文件的数据都要存储在不同的组中。每个组都需要包含1)来自文件的原始数据作为m x n矩阵和2)从归一化的原始数据生成的图像光栅。

我能够完成第1部分,并能够规范化数据,但我无法将这些规范化的数据写入栅格图像,因为我不知道如何将栅格图像添加到组中。看起来应该有一种简单直接的方法来做到这一点,但我已经阅读了文档,没有找到一种方法。在h5py中如何实现这一点?如果不能使用h5py实现,我应该使用什么来完成这个任务呢?

谢谢!


光栅图像是numpy数组吗?数据也是一个数组吗?请重新阅读h5py文档。我相信numpy数组是您可以使用该软件包添加的基本数据单元。 - hpaulj
1
create_dataset是将numpy数组添加到组中的基本机制。请参考http://docs.h5py.org/en/latest/high/dataset.html。 - hpaulj
我可以将数据数组添加为m x n矩阵,但如何添加它以便显示为图像,例如这里的图像:链接,并使用h5py? - pyguy
1
可能是h5py在其端口中未包含此图像API。您可能需要询问开发人员:https://github.com/h5py/h5py - hpaulj
2
为什么不将数组保存为原样, 然后有单独的 matplotlib 代码将其绘制为图像呢? - abcd
1个回答

8
在HDF5中,图像并没有特别之处。您提供的链接是高级库绑定。您可以同样轻松地使用HDF5中的图像规格说明,这些规格说明只是属性。
以下是一个非常简单粗糙的示例:
#!/usr/bin/env python

import numpy as np
import h5py

# Define a color palette
pal =  np.array([[0,     0, 168],
                 [0,     0, 252],
                 [0,   168, 252],
                 [84,  252, 252],
                 [168, 252, 168],
                 [0,   252, 168],
                 [252, 252,  84],
                 [252, 168,   0],
                 [252,   0,   0]],
                 dtype=np.uint8
               )

# Generate some data/image
x = np.linspace(0,pal.shape[0]-1)
data,Y = np.meshgrid(x,x)

# Create the HDF5 file
f = h5py.File('test.h5', 'w')

# Create the image and palette dataspaces
dset = f.create_dataset('img', data=data)
pset = f.create_dataset('palette', data=pal)

# Set the image attributes
dset.attrs['CLASS'] = 'IMAGE'
dset.attrs['IMAGE_VERSION'] = '1.2'
dset.attrs['IMAGE_SUBCLASS'] =  'IMAGE_INDEXED'
dset.attrs['IMAGE_MINMAXRANGE'] = np.array([0,255], dtype=np.uint8)
dset.attrs['PALETTE'] = pset.ref

# Set the palette attributes
pset.attrs['CLASS'] = 'PALETTE'
pset.attrs['PAL_VERSION'] = '1.2'
pset.attrs['PAL_COLORMODEL'] = 'RGB'
pset.attrs['PAL_TYPE'] = 'STANDARD8'

# Close the file
f.close()

运行示例,然后在HDFView中查看图像: Image within HDF5 file 请注意,您必须使用“Open As”打开图像数据才能将其视为图像,因为表格视图是默认选项。

确实如此。我不知道在查看文档时是如何错过这个的。非常感谢你! - pyguy
1
@MojoJojo 我不用Matlab,但是在Matlab Answers网站上有一个答案。希望对你有所帮助。 - Timothy Brown
谢谢!这是一个很好的答案。为了完整起见,这里是我用于单通道灰度图像的属性:{ 'CLASS': 'IMAGE', 'IMAGE_VERSION': '1.2', 'IMAGE_SUBCLASS': 'IMAGE_GRAYSCALE', 'IMAGE_MINMAXRANGE': np.array([0, 255], dtype=np.uint8), 'IMAGE_WHITE_IS_ZERO': 0, } - Phil
发布的链接已经过时。应该更新为 https://support.hdfgroup.org/HDF5/Tutor/h5image.html 和 https://support.hdfgroup.org/HDF5/doc/ADGuide/ImageSpec.html。 - smillerc

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接