醫學圖像筆記(二)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''
顯示:
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下調試擷取其他資訊: