如何从nibabel加载的BraTS数据集nii.gz中提取图像?
解读Nibabel加载BraTS NIfTI文件的输出与数据提取指南
看起来你已经顺利用nibabel加载了BraTS数据集的NIfTI文件,这个输出包含了图像的核心结构信息和元数据,我来帮你拆解清楚,再教你怎么提取可用的图像数据:
一、输出内容逐段解读
1. 基础对象与数据形状
<class 'nibabel.nifti1.Nifti1Image'>:这说明你加载的是标准NIfTI 1格式的图像,nibabel用这个类来封装所有和图像相关的数据、空间信息以及元数据。data shape (240, 240, 155):这是图像的三维体素尺寸,对应宽×高×切片数(或者说冠状面×矢状面×轴向层数),简单说就是这个脑扫描有155层240×240的二维切片。
2. Affine空间变换矩阵
affine: [[ -1. 0. 0. -0.] [ 0. -1. 0. 239.] [ 0. 0. 1. 0.] [ 0. 0. 0. 1.]]
这个4×4矩阵是体素坐标和世界空间坐标之间的转换桥梁:
- 前3列的对角值
-1, -1, 1:结合后面的pixdim可知,每个体素的物理尺寸是1mm×1mm×1mm;负号表示坐标轴方向和标准空间相反(比如Y轴是从脑后部指向前部)。 - 最后一列的
-0., 239., 0.:是图像在世界空间中的偏移量,用来定位扫描的具体位置。
3. NIfTI头文件(核心元数据)
这部分是NIfTI文件的元信息集合,挑几个关键字段解释:
dim : [ 3 240 240 155 1 1 1 1]:第一个数字3表示这是三维图像,后面三个数字就是前面提到的各维度体素数量。datatype : int16:体素数据的存储类型是16位整数,这是医学图像的常用类型,既保证了精度又不会占用太多存储空间。bitpix : 16:每个体素占用的比特数,和datatype完全对应(int16就是16比特)。pixdim : [1. 1. 1. 1. 0. 0. 0. 0.]:前三个1确认了每个体素的物理尺寸是1mm×1mm×1mm,这也是BraTS数据集的标准分辨率。qform_code : aligned/sform_code : scanner:说明空间变换矩阵既对齐了标准空间,又保留了扫描仪的原始坐标信息。
二、提取图像体素数据的方法
加载后的img对象是Nifti1Image实例,提取数据非常简单,有两种常用方式:
方法1:获取浮点型numpy数组(推荐)
# 提取体素数据为float64类型的numpy数组,兼容性最好 img_data = img.get_fdata()
得到的img_data是形状为(240, 240, 155)的numpy数组,你可以直接用它做可视化或预处理,比如显示第100层切片:
import matplotlib.pyplot as plt # 可视化第100层切片(索引从0开始) plt.imshow(img_data[:, :, 100], cmap='gray') plt.title('BraTS FLAIR Slice 100') plt.axis('off') plt.show()
方法2:获取原始整数类型数组
如果想严格保留原始的int16类型(避免类型转换的开销),可以用:
import numpy as np # 方式1:指定dtype获取 img_data_int16 = img.get_fdata(dtype=np.int16) # 方式2:直接访问dataobj转换为数组 img_data_int16 = np.asarray(img.dataobj)
这样得到的数组类型和头文件里的datatype : int16完全一致,适合需要原始数据的场景。
小提示:BraTS每个病例都有多个模态文件(FLAIR、T1、T1ce、T2),你可以用同样的方法加载其他模态,之后就能进行预处理或者模型训练啦。
内容的提问来源于stack exchange,提问作者Naman Bansal
相关产品推荐
相关产品推荐

