第一步安裝nibabel,可以使用命令:pip install nibabel
之后:
from nibabel.viewers import OrthoSlicer3D as osd
import nibabel as nib
import nibabel as nib
filename = 'image.nii'
img = nib.load(filename)
#輸出文件信息
print(img)
print(img)
w,h,q = img.dataobj.shape
#顯示3D圖像
osd(img.dataobj).show()
osd(img.dataobj).show()
結果:
<class 'nibabel.nifti1.Nifti1Image'>
data shape (512, 512, 333)
affine:
[[ -0.82617199 0. 0. 204.01400757]
[ 0. -0.82617199 0. 211.5 ]
[ 0. 0. 1.25 -431.97399902]
[ 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 512 512 333 1 1 1 1]
intent_p1 : 0.0
intent_p2 : 0.0
intent_p3 : 0.0
intent_code : none
datatype : int32
bitpix : 32
slice_start : 0
pixdim : [1. 0.826172 0.826172 1.25 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 : 1.0
qoffset_x : 204.014
qoffset_y : 211.5
qoffset_z : -431.974
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'
data shape (512, 512, 333)
affine:
[[ -0.82617199 0. 0. 204.01400757]
[ 0. -0.82617199 0. 211.5 ]
[ 0. 0. 1.25 -431.97399902]
[ 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 512 512 333 1 1 1 1]
intent_p1 : 0.0
intent_p2 : 0.0
intent_p3 : 0.0
intent_code : none
datatype : int32
bitpix : 32
slice_start : 0
pixdim : [1. 0.826172 0.826172 1.25 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 : 1.0
qoffset_x : 204.014
qoffset_y : 211.5
qoffset_z : -431.974
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'
各字段意義:
sizeof_hdr:sizeof_hdr 是保存文件的頭文件大小,如果是NIFTI-1或者ANALYZE格式的文件sizeof_hdr=348.
dim_info:dim_info字段存儲着頻率編碼方向(1,2,3),相位編碼方向(1,2,3)和采集期間層選擇方向(1,2,3),對於徑向采集來講,頻率編碼和相位編碼都設置為0。
dim:short dim[8]保存着前面提到的圖像的維度信息。如果第0維不是(1-7)之間的數字,那么這個數據具有相反的字節順序,所以應該進行字節交換(NIFTI標准沒有提供字節順序的字段,提倡使用dim[0])。
intent系列(影響到圖像數據的讀取和存儲)
datatype和bitpix
datatype中存儲的是數據的類型,可接受類型如下:


而bitpix字段必須與datatype中的代碼所對應的bit(s)/pix的大小相等。
slice切片信息
包含字段:slice_start,slice_end, slice_code, slice_duration
slice_duration是存儲功能磁共振成像采集的時間相關信息,需要與dim_info字段一起使用。
pixdim體素維度:每個體素維度信息都保存在pixdim[8]中,各自對應dim[8],但pixdim[0]有特殊意義,其值只能是-1或1。前四個維度將在xyzt_units字段中指定。
vox_offset體素偏移量:vox_offset指 單個文件(.nii)圖像數據的字節偏移量。
scl_slope和scl_inter數據縮放的斜率和截距
存儲在每個體素中的值可以線性縮放到不同的單位。字段float scl_slope和float scl_inter定義一個斜率和一個線性函數的截距。數據縮放功能允許存儲在比數據類型所允許的范圍更廣的范圍內。但是,可以在相同的數據類型中使用縮放。對於rgb數據的存儲,兩個縮放字段都應該被忽略。對於復雜類型,它應用於實部和虛部。
cal_max 和cal_min數據顯示
存儲標量數據的文件,這兩個字段用來圖像打開時默認顯示范圍。體素值小於等於cal_min的像素顯示為顯示范圍中的最小值(灰度范圍內通常為黑),大於等於cal_max的值顯示為顯示范圍中的最大值(通常為白色),注意:這里並不是真實改變數據大小,而是改變顯示大小。
xyzt_units 度量單位
在dim[1]和dim[4]中用到的空間和時間測量單元(對應各自的pixdim[1]和pixdim[4]),編碼在xyzt_units字段中,1-3 bit用來存儲空間維度,4-6 bit用來存儲時間維度,6-7 bit沒有使用。時間偏移量放在float toffset字段中,xyzt_units十進制編碼如下:

descrip描述
該字段char descrip[80]可以包含最多80個字符的文本。標准中沒有指定這個字符串是否需要被空字符終止
aux_file附加文件
包含額外信息的補充文件可放在該字段中
magic
該字符串聲明文件符合NIFTI標准。
理想情況下,應該先檢查該字段,如果字段中存儲為”ni1”(或者是16進制的‘6E 69 31 00’),那么是.hdr/.img文件對形式;如果是’n+1’(或’6E 2B 31 00’),那么就是單一的.nii文件;而如果缺少字符串,那么就按照ANALYZE格式處理。