1、NIFTI格式的基本内容

“神经成像信息技术创新”将NIFTI格式视为ANALYZE7.5格式的替代品。NIFTI最初是用于神经成像的,但它也适用于一些其他的领域。NIFTI中一个主要的特点在于它包含了两个仿射坐标定义,这两个仿射坐标定义能够将每个立体元素指标(i,j,k)和空间位置(x,y,z)联系起来。 Nibabel是用于读取nifti文件的一个朋友Python库,“oro.nifti”是用于读取nifti数据的一个R工具包。

标准NIfTI图像的扩展名是.nii,包含了头文件及图像资料。由于NIfTI格式和Analyze格式的关系,因此NIfTI格式也可使用独立的图像文件[.img]和头文件[.hdr]。单独的.nii格式文件的优势就是可以用标准的压缩软件[如gzip],而且一些分析软件包[比如FSL]可以直接读取和写入压缩的.nii文件[扩展名为.nii.gz]。

简而言之,nii格式和.nii.gz格式是一个东西。

2、python使用 nibabel读取.nii.gz文件

# -*- coding : UTF-8 -*-
# @file   : rd_niigz.py
# @Time   : 2021-09-14 17:40
# @Author : wmz
# encoding=utf8
'''
查看和显示nii文件
'''

import matplotlib

matplotlib.use('TkAgg')

from matplotlib import pylab as plt
import nibabel as nib
from nibabel import nifti1
from nibabel.viewers import OrthoSlicer3D
# 文件名,nii或nii.gz
example_filename = './img/0001.nii.gz'

img = nib.load(example_filename)
print(img)
print(img.header['db_name'])  # 输出头信息
# shape不一定只有三个参数,打印出来看一下
width, height, queue = img.dataobj.shape
# 显示3D图像
OrthoSlicer3D(img.dataobj).show()

num = 1
# 按照10的步长,切片,显示2D图像
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()

对于图像处理,可用信息包括:

data shape (400, 256, 256)
affine [[ 1. 0. 0. -213.39100647]
[ 0. 1. 0. 47.1853981 ]
[ 0. 0. 1. -561.7199707 ]
[ 0. 0. 0. 1. ]]
datatype int16
xyzt_units 2
qoffset_x -213.391
qoffset_y 47.1854
qoffset_z -561.72

打印输出:

D:\anaconda3\envs\pytorch190\python.exe D:/documents/python/md_img/rd_niigz.py
<class 'nibabel.nifti1.Nifti1Image'>
data shape (400, 256, 256)
affine: 
[[   1.            0.            0.         -213.39100647]
 [   0.            1.            0.           47.1853981 ]
 [   0.            0.            1.         -561.7199707 ]
 [   0.            0.            0.            1.        ]]
metadata:
<class 'nibabel.nifti1.Nifti1Header'> object, endian='<'
sizeof_hdr      : 348
data_type       : b''
db_name         : b''
extents         : 0
session_error   : 0
regular         : b'r'
dim_info        : 0
dim             : [  3 400 256 256   1   1   1   1]
intent_p1       : 0.0
intent_p2       : 0.0
intent_p3       : 0.0
intent_code     : none
datatype        : int16
bitpix          : 16
slice_start     : 0
pixdim          : [1. 1. 1. 1. 0. 0. 0. 0.]
vox_offset      : 0.0
scl_slope       : nan
scl_inter       : nan
slice_end       : 0
slice_code      : unknown
xyzt_units      : 2
cal_max         : 0.0
cal_min         : 0.0
slice_duration  : 0.0
toffset         : 0.0
glmax           : 0
glmin           : 0
descrip         : b''
aux_file        : b''
qform_code      : scanner
sform_code      : unknown
quatern_b       : 0.0
quatern_c       : 0.0
quatern_d       : 0.0
qoffset_x       : -213.391
qoffset_y       : 47.1854
qoffset_z       : -561.72
srow_x          : [0. 0. 0. 0.]
srow_y          : [0. 0. 0. 0.]
srow_z          : [0. 0. 0. 0.]
intent_name     : b''
magic           : b'n+1'
b''

显示:
在这里插入图片描述

3、python使用itk读取.nii,gz文件

# -*- coding : UTF-8 -*-
# @file   : itk_p3.py
# @Time   : 2021-09-14 18:13
# @Author : wmz

import SimpleITK as sitk
import skimage.io as io


def read_img(path):
    img = sitk.ReadImage(path)
    data = sitk.GetArrayFromImage(img)
    return data


# 显示一个系列图
def show_img(data):
    for i in range(data.shape[0]):
        io.imshow(data[i, :, :], cmap='gray')
        print(i)
        io.show()


# 单张显示
# def show_img(ori_img):
#     io.imshow(ori_img[100], cmap='gray')
#     io.show()


if __name__ == "__main__":
    # window下的文件夹路径
    path = '..\\md_img\\img\\0001.nii.gz'
    data = read_img(path)
    show_img(data)

显示:
在这里插入图片描述
调试信息:
在这里插入图片描述

通过与nibable读取的信息对比可知,nibable维度信息 是 x,y,z轴顺序,itk读取的信息是z,x,y轴顺序。
itk下调试获取其他信息:
在这里插入图片描述

Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐