对于我正在做的项目,我想编写一个脚本,该脚本可以以nifti格式(.nii扩展名)计算MRI图像的总大脑体积。我不知道该怎么做是遍历所有单个体素并提取其中的整数数据。有人知道该怎么做吗?
这是我用来在Python中加载特定nifti图像的代码:
import nibabel as nib
import numpy as np
import os
path = '/Users/arnavlohe/Desktop/ADNI_002_S_0782_MR_MP-RAGE_REPEAT_br_raw_20060814234209235_1_S17836_I20520_be_be_mixeltype.nii'
img = nib.load(path)
print(img)
这是结果输出/图像数据:
<class 'nibabel.nifti1.Nifti1Image'>
data shape (166, 256, 256)
affine:
[[ 1.20000184 0. 0. 113.7559967 ]
[ 0. 0.9375 0. 158.26870728]
[ 0. 0. 0.9375 418.0289917 ]
[ 0. 0. 0. 1. ]]
metadata:
<class 'nibabel.nifti1.Nifti1Header'> object, endian='<'
sizeof_hdr : 348
data_type :
db_name :
extents : 0
session_error : 0
regular : r
dim_info : 0
dim : [ 3 166 256 256 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. 1.2000018 0.9375 0.9375 1. 0.
0.
0. ]
...
这是我所能提供的全部信息,对不起,我的问题没有再具体了。
答案 0 :(得分:1)
您可以结合使用get_fdata()
来检索图像数据作为NumPy数组:
a= [ 0.1111113, 0.222222]
print(f'{a[0]:.2f}, {a[1]:.2f}')
和NumPy indexing访问体素,例如:
img = nib.load(path)
data = img.get_fdata()
最后请注意,您可以在Neurostars上问类似的问题。
答案 1 :(得分:1)
请勿循环遍历每个体素,这将非常慢(需要几分钟才能运行)。而是使用适用于整个数组的numpy操作。我建议使用阈值:
img = nib.load(path)
voxel_volume = np.prod(img.header['pixdim'][1:4])
data = img.get_fdata()
threshold = 0
mask = np.where(data > threshold, 1, 0)
volume = voxel_volume*np.sum(mask)
print(volume/1000, "cm³")
答案 2 :(得分:0)
非常近似的计算:
img = nib.load(path)
voxel_volume = np.prod(img.header['pixdim'][1:4])
voxel_count = np.count_nonzero(img.get_fdata())
print(voxel_volume*voxel_count/1000, "cm³")