天天看點

醫學圖像筆記(二)NIFTI資料格式1、NIFTI格式的基本内容2、python使用 nibabel讀取.nii.gz檔案3、python使用itk讀取.nii,gz檔案

醫學圖像筆記(二)NIFTI資料格式

  • 1、NIFTI格式的基本内容
  • 2、python使用 nibabel讀取.nii.gz檔案
  • 3、python使用itk讀取.nii,gz檔案

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''

           

顯示:

醫學圖像筆記(二)NIFTI資料格式1、NIFTI格式的基本内容2、python使用 nibabel讀取.nii.gz檔案3、python使用itk讀取.nii,gz檔案

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)

           

顯示:

醫學圖像筆記(二)NIFTI資料格式1、NIFTI格式的基本内容2、python使用 nibabel讀取.nii.gz檔案3、python使用itk讀取.nii,gz檔案

調試資訊:

醫學圖像筆記(二)NIFTI資料格式1、NIFTI格式的基本内容2、python使用 nibabel讀取.nii.gz檔案3、python使用itk讀取.nii,gz檔案

通過與nibable讀取的資訊對比可知,nibable次元資訊 是 x,y,z軸順序,itk讀取的資訊是z,x,y軸順序。

itk下調試擷取其他資訊:

醫學圖像筆記(二)NIFTI資料格式1、NIFTI格式的基本内容2、python使用 nibabel讀取.nii.gz檔案3、python使用itk讀取.nii,gz檔案

繼續閱讀