如何从类型为|V376的H5文件提取可用于FFT2的MRI图像方阵?
解决Stanford 2D FSE H5文件的K空间数据提取问题
第一步:解析|V376类型的二进制数据
|V376是固定长度的字节数组类型,每个元素对应376字节的MRI原始采集数据(封装了K空间采样点、编码信息等),不是直接可用的数值张量,需要先解析为复数形式:
- 读取原始字节数据:
import h5py import numpy as np with h5py.File('your_file.h5', 'r') as f: raw_byte_data = f['data'][()] # 获取(10440,)的字节数组 - 转译复数采样点:Stanford 2D FSE数据通常用**16位整数对(实部+虚部)**存储复数,376字节对应94个复数点(94×4字节=376)。直接把整段字节转成int16数组,再组合为复数:
int_array = np.frombuffer(raw_byte_data.tobytes(), dtype=np.int16) complex_kspace_raw = int_array[::2] + 1j * int_array[1::2]
第二步:重构K空间方阵
一维复数数组需要根据扫描参数重构为二维方阵,先从H5文件中提取关键参数(用f.visit(print)遍历所有键,找config或acquisition组下的参数):
reconMatrixSizeX/frequency_encode_steps:频率编码方向点数(通常是方阵边长,如256/320)reconMatrixSizeY/phase_encode_steps:相位编码方向点数(与X一致即为方阵)
重构示例
假设参数为reconMatrixSizeX=256、reconMatrixSizeY=256:
# 截取对应长度的采样点,reshape为二维方阵 kspace_matrix = complex_kspace_raw[:256*256].reshape((256, 256))
如果原始复数数组长度远大于方阵总点数,说明是多切片/多回波数据,需先按切片拆分再取单切片数据reshape。
第三步:验证与可视化
重构完成后即可进行FFT变换和可视化:
import matplotlib.pyplot as plt # K空间可视化 plt.figure(figsize=(8,8)) plt.imshow(np.log1p(np.abs(np.fft.fftshift(kspace_matrix))), cmap='gray') plt.title('K-space') plt.show() # 转换为图像空间 recon_image = np.abs(np.fft.ifft2(np.fft.fftshift(kspace_matrix))) plt.figure(figsize=(8,8)) plt.imshow(recon_image, cmap='gray') plt.title('Reconstructed MRI Image') plt.show()
补充提示
- 若找不到参数,可尝试用256、320、512等常见MRI方阵尺寸reshape,观察重构图像是否合理。
- 部分文件的字节块可能包含头信息(如前几个字节是相位编码索引),可打印前几个字节块的前10字节,判断是否有固定规律的数值,再剥离头信息后解析复数数据。
内容的提问来源于stack exchange,提问作者Giovanni Petrone
相关产品推荐
相关产品推荐

