1.NIFTI格式图像图像来源
很有必要自己浏览这个网址,详细介绍了NIFTI的细节
有助于代码理解的点做以下总结:
- nifti格式存储的数据使用了一对文件**.hdr/.img**
- 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
结果: