首页 > 解决方案 > 如何比较多个hdf5文件

问题描述

我有一个图像的多个 h5py 文件(像素级注释)。图像掩码作为键值对存储在 hdf5 文件中,键是某个类的 id。掩码(hdf5 文件)都与其对应图像的尺寸相匹配,并代表图像中像素的标签。我需要将所有 h5 文件相互比较,并找出代表大多数的最终掩码。但我不知道如何在 python 中比较多个 h5 文件。有人可以帮忙吗?

标签: pythonimage-processinghdf5h5pyhdf5storage

解决方案


“比较”是什么意思?

如果您只想比较文件以查看它们是否相同,您可以使用HDF5 Grouph5diff的实用程序。它带有 HDF5 安装程序。您可以在此处获取有关 h5diff 的更多信息:h5diff 实用程序。所有 HDF5 实用程序的链接位于页面顶部:HDF5 工具

听起来你需要做更多的事情。请澄清您所说的“找出代表大多数人的最终面具”的意思。您想找到平均图像大小(平均值、中值或众数)吗?如果是这样,打开每个文件并获取图像数据的维度(每个数据集的形状——你称之为值)是“相对简单的”(如果你知道 Python)。作为参考,key, value术语是 h5py 如何引用 HDF5 数据集namesdatasets.

这是打开 1 个 HDF5 文件并遍历数据集(按键名)以获取数据集形状(图像大小)的过程的基本概述。对于多个文件,您可以for使用迭代器添加一个循环iglob来获取 HDF5 文件名。为简单起见,我将形状值保存到 3 个列表中并手动计算平均值 ( sum()/len())。如果你想以不同的方式计算掩码,我建议使用 NumPy 数组。它具有内置的均值中值函数。对于mode,您需要scipy.stats模块(它适用于 NumPy 数组)。

方法1:迭代 .keys()

s0_list = []
s1_list = []
s2_list = []    
with h5py.File(filename,'r')as h5f:
    for name in h5f.keys() :
        shape = h5f[name].shape
        s0_list.append(shape[0])
        s1_list.append(shape[1])
        s2_list.append(shape[2])
    
print ('Ave len axis=0:',sum(s0_list)/len(s0_list))
print ('Ave len axis=1:',sum(s1_list)/len(s1_list))
print ('Ave len axis=2:',sum(s2_list)/len(s2_list))

方法 2:迭代 .items()

s0_list = []
s1_list = []
s2_list = []    
with h5py.File(filename,'r')as h5f:
    for name, ds in h5f.items() :
        shape = ds.shape
        s0_list.append(shape[0])
        s1_list.append(shape[1])
        s2_list.append(shape[2])
    
print ('Ave len axis=0:',sum(s0_list)/len(s0_list))
print ('Ave len axis=1:',sum(s1_list)/len(s1_list))
print ('Ave len axis=2:',sum(s2_list)/len(s2_list))

推荐阅读