如何从 HDF5 文件中提取单个 JPEG 图像

Posted

技术标签:

【中文标题】如何从 HDF5 文件中提取单个 JPEG 图像【英文标题】:How to extract individual JPEG images from a HDF5 file 【发布时间】:2021-06-26 16:04:20 【问题描述】:

我有一个大的 HDF5 文件,其中包含图像及其对应的地面实况密度图。 我想将它们放入网络 CRSNet 中,它需要单独文件中的图像。 我怎样才能做到这一点?非常感谢。

-- 基本信息 我有一个 HDF5 文件,其中包含两个键“images”和“density_maps”。它们的形状是 (300, 380, 676, 1)。 300代表图片数量,380和676分别代表高度和宽度。

-- 我需要放入 CRSNet 网络的是带有相应 HDF5 文件的图像 (jpg)。它们的形状是 (572, 945)。

非常感谢您的任何评论和讨论!

【问题讨论】:

【参考方案1】:

首先,简要说明一下 h5py 和 HDF5。 h5py 是一个 Python 包,用于读取 HDF5 文件。您还可以使用 PyTables 包(以及其他语言:C、C++、FORTRAN)读取 HDF5 文件。

我不完全确定“图像 (jpg) 及其相应的 h5py (HDF5) 文件”是什么意思,据我了解,您的所有数据都在 1 个 HDF5 文件中。另外,我不明白您的意思是:“它们的形状将是 (572, 945)。” 这与图像数据不同,对吧?请更新您的帖子以澄清这些项目。

从数据集中提取数据相对容易。这就是您如何将“图像”作为 NumPy 数组获取并使用 cv2 写入单个 jpg 文件的方法。见以下代码:

with h5py.File('yourfile.h5','r') as h5f:
    for i in range(h5f['images'].shape[0]):
        img_arr = h5f['images'][i,:]   # slice notation gets [i,:,:,:]
        cv2.imwrite(f'test_img_i:03.jpg',img_arr)

在开始编码之前,您确定需要将图像作为单独的图像文件还是单独的图像数据(通常是 NumPy 数组)?我问是因为大多数 CNN 处理的第一步是读取图像并将它们转换为数组以进行下游处理。您已经拥有 HDF5 文件中的数组。您可能需要做的就是读取每个数组并保存到适当的数据结构中,以便 CRSNet 处理它们。例如,这里是创建数组列表的代码(TensorFlow 和 Keras 使用):

image_list = []
with h5py.File('yourfile.h5','r') as h5f:
    for i in range(h5f['images'].shape[0]):
        image_list.append( h5f['images'][i,:] )  # gets slice [i,:,:,:]
        

【讨论】:

非常感谢您的回答和建议。我正在github.com/leeyeehoo/CSRNet-pytorch 上学习 CRSNet 的使用,因此输入的 json 文件是图像的路径,代码相应地将其替换为 h5 文件

以上是关于如何从 HDF5 文件中提取单个 JPEG 图像的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 ffmpeg 从视频文件中提取高质量的 JPEG 图像?

将包含 jpeg 图像的文件夹转换为 hdf5

将 hdf5 文件合并为单个数据集

使用 libjpeg / C++ 从文件中提取 JPEG 编码位图 (BMP) 图像

如何从android中的jpeg图像中提取文本[关闭]

如何从 .hdf5 文件表中提取列名并根据指定的列名提取特定行数据?