1. 前言
python讀取nifti文件需要nibabel這個包,所以在第一次使用的時候需要安裝它。命令是pip install nibabel.
2. 方法
2.1 讀取
import nibabel as nib
nii = nib.load('data.nii')
data = nii.get_fdata()
print(data.shape)
會顯示出矩陣的維度信息。這里的nii表示nifti文件在內存中的表示,data是nifti文件中的矩陣。
2.2 寫入
import nibabel as nib
nii = nib.load('data.nii')
data = nii.get_fdata()
print(data.shape)
# 在內存中創建新的nifti,需要兩個參數,一個是矩陣,另一個是affine矩陣,這里我們用上面的nii文件的affine矩陣來創建
niiNew = nib.Nifti1Image(data, nii.affine)
nib.save(niiNew, 'data_new.nii')
寫入需要一個affine矩陣,我一般都會事先讀入一個nii文件,然后用它的affine屬性去創建新的nifti。然后用nib.save()將內存中的nifti寫入磁盤。
2.3 替換特定值
import nibabel as nib
nii = nib.load('data.nii')
data = nii.get_fdata()
print(data.shape)
# 將矩陣中所有非零元素都重新設置為1,也可以設定其他的閾值來制作不同的模板
data[data!=0]=1
niiNew = nib.Nifti1Image(data, nii.affine)
nib.save(niiNew, 'data_new_mask.nii')
制作mask。將矩陣中所有非零元素都重新設置為1。其他地方都是零。然后保存。這樣如果需要用這個mask提取別的nifti文件中的對應位置上的值的時候,只需要將這個矩陣data和新讀入的nifti中的矩陣乘起來就行,這里默認的乘法是對應位置兩個元素之間相乘。
2.4 官方文檔
3. MATLAB讀入矩陣
clc; clear vars; close all;
% 將nii文件讀入內存
vol = spm_vol('data.nii');
% 讀取nii文件中的矩陣
data = spm_read_vols(vol);
% 替換矩陣中的特定值
data(data~=0) = 1;
% 保存
% matlab里面只需要修改vol的fname這個屬性,然后將修改完的data和vol一起寫會磁盤就行
% 如果不改名字,它會覆蓋原來的nifti文件
vol.fname = 'data_new_matlab.nii';
spm_write_vol(vol, data);
disp('Done!');
4. 總結
nifti相關的矩陣操作主要用到的工具有python里面的nibabel包和matlab里面的spm_vol(), spm_read_vols()和spm_write_vol()這三個函數。