python 读取NIFTI(.nii)格式图像

1.NIFTI格式图像图像来源

很有必要自己浏览这个网址,详细介绍了NIFTI的细节
有助于代码理解的点做以下总结:

  1. nifti格式存储的数据使用了一对文件**.hdr/.img**
  2. nifti格式中,前三个维度以定义三个空间维度-x,-y和-z,第四个维度定义时间点-t。其余维度(五到七)用于其他用途。比如,第五维可以存一些预定义的用途,例如存储体素特定的分布参数或保存基于矢量的数据。
2.NiBabel包

NiBabel包是可以对常见的医学和神经影像文件格式进行读写

import matplotlib
from matplotlib import pylab as plt
import nibabel as nib
from nibabel import nifti1
from nibabel.viewers import OrthoSlicer3D

img_path="E:/Pyproject/registration/icnet_data/image_A.nii"
img=nib.load(img_path)
#print(img.shape)#(160, 192, 144)
#print(img.header['db_name'])

#有些可能图片是四维的
width,height,queue=img.dataobj.shape
OrthoSlicer3D(img.dataobj).show()

3D显示输出结果如下:
注意刚开始出现三个黑色方框,可以滚动鼠标,移动绿色的线。因为这是一组序列图。
在这里插入图片描述
分段显示如下:

import matplotlib
from matplotlib import pylab as plt
import nibabel as nib
from nibabel import nifti1
from nibabel.viewers import OrthoSlicer3D

img_path="E:/Pyproject/registration/icnet_data/image_A.nii"
img=nib.load(img_path)
#print(img.shape)#(160, 192, 144)
width,height,queue=img.dataobj.shape

num=1
for i in range(0,queue,8):#也可以取10等
    img_arr=img.dataobj[:,:,i]
    plt.subplot(5,4,num)
    plt.imshow(img_arr,cmap='gray')
    num+=1
plt.show()

结果:
在这里插入图片描述

3. SimpleIKT 读取数据

需要注意,SimpleIKT读取出来的图片的维度顺序与NiBabel 不同

import SimpleITK as itk 
from matplotlib import pyplot as plt 

def show_nii(img):
    num=1
    for i in range(0,img.shape[0],10):
        plt.imshow(img[i,:,:],cmap='gray')
        plt.subplot(5,4,num)
        num+=1
        
itk_img=itk.ReadImage('E:/Pyproject/registration/icnet_data/image_A.nii')
img=itk.GetArrayFromImage(itk_img)
print(img.shape) #(144, 192, 160) 
show_nii(img)
plt.show()

结果:
在这里插入图片描述
如果想要得到不同方向的切片,对show_nii 函数进行修改

def show_nii(img):
    num=1
    for i in range(0,img.shape[1],10): 
        plt.imshow(img[:,i,:],cmap='gray')
        plt.subplot(5,4,num)
        num+=1
        

结果:在这里插入图片描述

发布了17 篇原创文章 · 获赞 5 · 访问量 5158

猜你喜欢

转载自blog.csdn.net/Emily_Buffy/article/details/104879558