如何比较多个 hdf5 文件

How to compare multiple hdf5 files

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

“比较”是什么意思?

如果您只想比较文件以查看它们是否相同,您可以使用 HDF5 Group 中的 h5diff 实用程序。它带有 HDF5 安装程序。您可以在此处获得有关 h5diff 的更多信息:h5diff utility. Links to all HDF5 utilities are at the top of the page:HDF5 Tools

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

的方式

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

方法一:迭代.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))

方法二:迭代.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))