如何读取NIFTI格式图像(.nii文件)

在医学图像处理中,我们经常使用一种NIFTI格式图像(.nii文件),现在我们来看看

  1. 什么是.nii文件?
  2. 该如何读取.nii文件?

1. NIFTI格式图像

  1. 什么是NIFTI(Neuroimaging Informatics Technology Initiative)格式图像?
    在讲解什么是NIFTI格式之前,得先了解一下Analyze格式。Analyze格式储存的每组数据组包含2个文件,一个为数据文件,其扩展名为.img,包含二进制的图像资料;另外一个为头文件,扩展名为.hdr,包含图像的元数据。在fMRI的早期,Analyze格式最常用的格式,但现在逐渐被NIFTI格式所取代。Analyze格式主要不足就是头文件不能真正反映元数据。
    标准NIFTI图像的扩展名是.nii,也包含了头文件及图像资料。由于NIFTI格式和Analyze格式的关系,因此NIFTI格式也可使用独立的图像文件(.img)和头文件(.hdr)。单独的.nii格式文件的优势就是可以使用标准的压缩软件(如gzip)进行压缩,而且一些分析软件包(比如FSL)可以直接读取和写入压缩的.nii文件(扩展名为.nii.gz)。

  2. 为什么会出现NIFTI格式图像?
    原来的ANALYZE 7.5 format图像格式缺少一些信息,比如没有方向信息,病人的左右方位等,如果需要包括额外的信息,就需要一个额外的文件,比如ANALYZE 7.5就需要一对<.hdr, .img>文件来保存图像的完整信息。因此,解决这个问题Data Format Working Group (DFWG) 将图像格式完整的定义为NIFTI格式。

详细了解NIFTI格式请参见: https://brainder.org/2012/09/23/the-nifti-file-format/

2. 读取NIFTI格式图像

2.1 ITK-SNAP

推荐ITK-SNAP下载地址:http://www.itksnap.org/pmwiki/pmwiki.php?n=Downloads.SNAP3
如何读取NIFTI格式图像(.nii文件)_第1张图片
可以看到:itk-snap获得了分别来自三个角度的视图(水平面、矢状面、冠状面)
如何读取NIFTI格式图像(.nii文件)_第2张图片

2.2 itkwidgets

详细请参见:https://pypi.org/project/itkwidgets/
如何读取NIFTI格式图像(.nii文件)_第3张图片可以查看各个视图的截面:
如何读取NIFTI格式图像(.nii文件)_第4张图片

如果显示不了图像请参考:https://www.jianshu.com/p/0757521cdf3e

2.3 simpleITK

这是使用最多的一种图像处理工具

import SimpleITK as sitk
from matplotlib import pyplot as plt
 
def showNii(img):
    for i in range(img.shape[0]):
        plt.imshow(img[i,:,:],cmap='gray')
        plt.show()
 
itk_img = sitk.ReadImage('./Brats18_2013_2_1_flair.nii.gz')
img = sitk.GetArrayFromImage(itk_img)
print(img.shape)    # (155, 240, 240) 表示各个维度的切片数量
showNii(img)

如何读取NIFTI格式图像(.nii文件)_第5张图片

2.4 Nibabel

import matplotlib
matplotlib.use('TkAgg')
 
from matplotlib import pylab as plt
import nibabel as nib
from nibabel import nifti1
from nibabel.viewers import OrthoSlicer3D
 
example_filename = './Brats18_2013_2_1_flair.nii.gz'
 
img = nib.load(example_filename)
print (img)
print (img.header['db_name'])   # 输出头信息

# 由文件本身维度确定,可能是3维,也可能是4维 
width,height,queue=img.dataobj.shape
 
OrthoSlicer3D(img.dataobj).show()
 
num = 1
for i in range(0,queue,10):
 
    img_arr = img.dataobj[:,:,i]
    plt.subplot(5,4,num)
    plt.imshow(img_arr,cmap='gray')
    num +=1
 
plt.show()

如何读取NIFTI格式图像(.nii文件)_第6张图片

你可能感兴趣的:(DeepLearning)