You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何从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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.07 20:02:41