1.nibabel简介
NiBabel提供对一些常见医学和神经影像文件格式的读/写访问,包括ANALYZE(plain,SPM99,SPM2及更高版本),GIFTI,NIfTI1,NIfTI2,CIFTI-2,MINC1,MINC2,AFNI BRIK/HEAD,MGH和ECAT以及Philips PAR/REC。该库可以完全或选择性地访问各种图像格式的元数据,可以通过 NumPy 数组访问图像数据,对DICOM 的支持非常有限,也是PyNIfTI第三方库的继任者。
nibabel图像由三个方面组成
- 3D 或 4D图像数据数组
- 一个告知图像数组数据在引用空间中的位置的仿射数组
- 描述图像的图像元数据(关于数据的数据),通常以图像头部的形式。
本文主要讨论利用nibabel库读写NIfTI格式的脑肿瘤图像,文件后缀名为.nii.gz
,同时使用matplotlib显示图像数据。
2.nibabel安装及导入
安装Python第三方库之前建议配置一个国内镜像,如清华镜像源,详见Linux配置pip清华镜像源、Windows配置pip国内镜像源
在Linux系统Terminal中执行下列命令即可
pip install nibabel
nibabel导入范式,一般需要重命名导入
import nibabel as nib
3.nibabel常用函数和属性
3.1nibabel.load(filename, **kwargs)
加载给定文件名的文件,猜测文件类型,返回SpatialImage实例。这里得到Nifti1Image实例的脑肿瘤图像。
import os
import matplotlib.pyplot as plt
import nibabel as nib
# 文件夹路径和文件名
dirname="/dataset/RSNA_ASNR_MICCAI_BraTS2021_TrainingData_16July2021/BraTS2021_00000/"
basename="BraTS2021_00000_t1.nii.gz"
full_path=os.path.join(dirname,basename)
# 加载脑肿瘤图像
brain_tumor_img=nib.load(full_path)
print("加载医学图像类型为{}".format(type(brain_tumor_img)))
3.2nibabel.nifti1.Nifti1Image.get_fdata(self,caching='fill',dtype=<class 'numpy.float64'>,)
Nifti1Image实例方法,返回应用了必要缩放的浮点图像数据
# 返回应用了必要缩放的浮点图像数据
brain_tumor_img_data=brain_tumor_img.get_fdata()
print("浮点图像数据类型为{}".format(type(brain_tumor_img_data)))
查看三个维度的切片数组
# 获得图像数据形状
print("图像数据形状为{}".format(brain_tumor_img_data.shape))
def show_slices(slices):
""" 显示一行图像切片 """
fig, axes = plt.subplots(1, len(slices))
for i, slice in enumerate(slices):
axes[i].imshow(slice.T, cmap="gray", origin="lower")
# 获得三个维度的切片
slice_0 = brain_tumor_img_data[120, :, :]
slice_1 = brain_tumor_img_data[:, 120, :]
slice_2 = brain_tumor_img_data[:, :, 77]
show_slices([slice_0, slice_1, slice_2])
plt.suptitle("Center slices for brain tumor image")
3.3nibabel.nifti1.Nifti1Image.affine
Nifti1Image实例属性,获得仿射变换矩阵
# 获得仿射变换矩阵
affine=brain_tumor_img.affine
print("仿射变换矩阵为\n{}".format(affine))
3.4nibabel.aff2axcodes(aff, labels=None, tol=None)
获得仿射的轴方向代码的函数
# 获得仿射的轴方向代码
orientation = nib.aff2axcodes(affine)
print("仿射的轴方向代码为\n{}".format(orientation))
3.5nib.save(img, filename, **kwargs)
将SpatialImage实例img保存到文件,使格式适应“filename”
# 将SpatialImage实例img保存到文件brain_tumour.nii
nib.save(brain_tumor_img,"brain_tumour.nii")
4.参考文献
- Neuroimaging in Python — NiBabel 4.0.0 documentation (nipy.org)
- The NIFTI file format | Brainder.
- The NIFTI-2 file format | Brainder.