nifti读取和操作
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()这三个函数。