如何在Python中处理.img/.hdr格式MRI扫描数据并查看切片
嘿,刚上手MRI文件的话,先给你捋清楚这些格式和操作步骤——你用nibabel加载的思路完全没问题,先从你已经得到的输出说起:
先搞懂你加载的SPM Analyze格式文件
你手里的.img/.hdr是SPM Analyze格式的MRI文件,这俩是成对出现的:.hdr存图像的元数据(比如尺寸、空间分辨率、数据类型),.img存实际的像素数值。你打印的输出已经说明加载成功了:Spm2AnalyzeImage就是nibabel对这种格式的封装,data shape (176,208,176,1)表示这是一个三维空间+1个单通道的图像,后面的affine矩阵是空间坐标转换用的,看切片暂时不用管它。
第一步:提取图像的数值数组
要查看切片,得先把nibabel对象里的像素数据转成numpy数组,用get_fdata()方法就行,还可以把最后那个没用的单通道维度去掉:
import nibabel as nib import numpy as np # 加载文件(注意:nibabel会自动关联同目录下的同名.hdr文件) img = nib.load('./OAS1_0001_MR1_mpr_n4_anon_111_t88_masked_gfc_fseg.img') # 提取数据为numpy数组 data = img.get_fdata() # 移除单通道维度(从(176,208,176,1)变成(176,208,176)) data = np.squeeze(data) print(data.shape) # 输出应该是(176, 208, 176)
第二步:查看不同方向的MRI切片
MRI是三维数据,我们可以从三个正交方向(轴位、冠状、矢状)查看切片,用matplotlib就能轻松显示:
轴位面(Axial,从上往下切,最常用的视角)
轴位面对应三维数组的第三个维度(索引为2),取中间位置的切片示例:
import matplotlib.pyplot as plt # 取轴位面的中间切片 axial_middle = data[:, :, data.shape[2] // 2] # 用灰度色图显示(MRI图像适合灰度) plt.imshow(axial_middle, cmap='gray') plt.title('Axial Slice (Middle)') plt.axis('off') # 关掉坐标轴更清晰 plt.show()
冠状面(Coronal,从前往后切)
冠状面对应第一个维度(索引为0):
coronal_middle = data[data.shape[0] // 2, :, :] plt.imshow(coronal_middle, cmap='gray') plt.title('Coronal Slice (Middle)') plt.axis('off') plt.show()
矢状面(Sagittal,从左往右切)
矢状面对应第二个维度(索引为1):
sagittal_middle = data[:, data.shape[1] // 2, :] plt.imshow(sagittal_middle, cmap='gray') plt.title('Sagittal Slice (Middle)') plt.axis('off') plt.show()
关于.gif格式的MRI文件
如果是MRI相关的.gif,通常是把多个切片做成了动画,直接用系统自带的图片查看器就能打开;要是想提取单帧切片,可以用PIL库处理:
from PIL import Image # 打开gif文件 mri_gif = Image.open('your_mri_gif_file.gif') # 遍历所有帧并保存/显示 for frame_idx in range(mri_gif.n_frames): mri_gif.seek(frame_idx) # 保存单帧为png mri_gif.save(f'mri_slice_{frame_idx}.png') # 或者直接显示 plt.imshow(mri_gif, cmap='gray') plt.show()
小技巧:调整切片视角
如果显示的切片是颠倒的,用np.flip()翻转就行,比如axial_middle = np.flip(axial_middle, axis=0),试几次就能调到你习惯的视角啦。
内容的提问来源于stack exchange,提问作者user7040867
相关产品推荐
相关产品推荐

