我正在尝试从 .h5 文件获取 MRI 图像数据,但我认为打印图像所需的张量的数据集存储在 (10440,) 类型“|V376”> 数据集中。我需要的是一个方阵,我可以用 fft2 对其进行变换并可视化 k 空间。有没有办法知道我需要在哪里查找数据?我从这里下载了该文件:http://mridata.org/list?project=Stanford%202D%20FSE。我尝试下载不同的文件,但它们都有这种奇怪的类型......
我打印了 .h5 文件中的单数组中包含的“数据”项,我得到的是一个列表数组,每个列表末尾都有一个浮点数组。我最后提取了这些数组,但它们没有正方形,所以它们不能用来形成图像。
你应该认为HDF5是一个容器,而不是一个固定的格式。因此,如上所述,在了解架构之前,您无法读取数据集。我翻阅了 mridata.org 网站上的文档。这是一个复杂的模式!基本上,MRI 数据位于名为
['dataset']['data']
的数据集中。该数据集是复合数据集(例如,将数据类型的混合存储为“字段/列”)。让事情变得复杂的是,一些字段也是复合数据集。幸运的是,您想要的图像数据我认为位于一个简单的字段中(也称为'data'
)。该字段包含对象数据(这就是使用此数据结构保存时 np.arrays 的存储方式)。
为了测试我的理论,我在引用的站点下载了第一个文件。 (文件名:
efac30a2-8b30-48e8-9a7c-aad2a05a46df.h5
。下面的代码询问文件并打印 ['dataset']['data']
数据集的形状和数据类型。它有 shape= (5824,)
,因此有 5824 行图像数据。然后循环遍历数据集的前 10 行该数据集中的 'data'
字段并打印形状和 dtype。它显示它们都是 shape=(11264,)
和 dtype=float32
。注意 img_data_arr
是我认为的图像数据。
代码如下:
with h5py.File('efac30a2-8b30-48e8-9a7c-aad2a05a46df.h5','r') as h5f:
for name, h5_obj in h5f['dataset'].items():
if isinstance(h5_obj, h5py.Dataset):
print(f'For dataset: {name}; Shape: {h5_obj.shape}')
print(h5_obj.dtype)
data = h5f['dataset']['data']['data']
print('\nFor data field in data dataset:'\
f'\nShape: {data.shape}, Dtype: {data.dtype}')
for i in range(10):
img_data_arr = data[i][()]
print(i, img_data_arr.shape, img_data_arr.dtype)
注意:mridata.org 网站还提供了 Python 代码,用于构建一套完整的工具来读取和处理这些数据。