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

Posted

技术标签:

【中文标题】使用 h5py 将光栅图像添加到 HDF5 文件【英文标题】:Add raster image to HDF5 file using h5py 【发布时间】:2015-06-25 19:13:48 【问题描述】:

如果这是一个新手问题,我深表歉意,但我对 Python 和 HDF5 相当陌生。我正在使用 h5py、numpy 和 Python 2.7。我有来自需要导入一个 HDF5 文件的各种文件的数据。每个文件中的数据将存储在不同的组中。这些组中的每一个都需要包含 1) 来自文件的原始数据作为 m x n 矩阵和 2) 从标准化原始数据生成的图像栅格。

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

谢谢!!

【问题讨论】:

光栅图像是numpy 数组吗?数据也是数组吗?重新阅读h5py 文档。我相信numpy 数组是您可以使用该包添加的基本数据单元。 docs.h5py.org/en/latest/high/dataset.html - create_dataset 是将 numpy 数组添加到组的基本机制。 我可以将数据数组添加为 m x n 矩阵,但是如何添加它以使其显示为图像;比如这里的那些:link using h5py? h5py 可能没有在其端口中包含此图像 API。您可能需要询问开发人员:github.com/h5py/h5py 为什么不按原样保存数组,然后使用单独的matplotlib 代码将其绘制为图像? 【参考方案1】:

HDF5 中的图像没有什么特别之处。您提供的link 用于高级库绑定。您可以轻松地使用 HDF5 中图像的specifications,它们只是属性。

这是一个非常快速而肮脏的例子:

#!/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 中查看图像:

请注意,您必须使用“打开方式”打开图像数据才能将其视为图像,因为表格视图是默认设置。

【讨论】:

正是这个。不知道我之前在查看文档时是如何错过的。非常感谢! @MojoJojo 我不使用 Matlab,但是 Matlab Answers website 上有答案。希望对您有所帮助。 谢谢!这是一个很好的答案。为了完整起见,以下是我用于单通道灰度图像的属性: 'CLASS': 'IMAGE', 'IMAGE_VERSION': '1.2', 'IMAGE_SUBCLASS': 'IMAGE_GRAYSCALE', 'IMAGE_MINMAXRANGE': np.array([0, 255], dtype=np.uint8), 'IMAGE_WHITE_IS_ZERO': 0, 发布的链接已弃用。它们应该更新为support.hdfgroup.org/HDF5/Tutor/h5image.html 和support.hdfgroup.org/HDF5/doc/ADGuide/ImageSpec.html

以上是关于使用 h5py 将光栅图像添加到 HDF5 文件的主要内容,如果未能解决你的问题,请参考以下文章

具有版本控制的 HDF5 文件 (h5py) - 每次保存时都会更改哈希

h5py 无法将元素 0 转换为 hsize_t

如何扩展 h5py 以便我可以访问 hdf5 文件中的数据?

高效地为具有内存限制的神经网络训练创建 HDF5 图像数据集

使用 h5py 删除 hdf5 数据集

判断使用 h5py 创建的 HDF5 文件是不是被压缩