【问题标题】:How can I Loop Through 3D NIFTI Image in Python如何在 Python 中循环遍历 3D NIFTI 图像
【发布时间】:2019-01-04 01:02:51
【问题描述】:

对于我正在做的一个项目,我想编写一个脚本,可以计算 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.       ]
... 

这是我能提供的所有信息,很抱歉我的问题不再具体。

【问题讨论】:

    标签: python nifti


    【解决方案1】:

    您可以结合get_fdata() 将图像数据检索为 NumPy 数组:

    img = nib.load(path)
    data = img.get_fdata()
    

    和NumPy indexing 访问体素,例如:

    data[1,1,1]
    

    最后请注意,您可以在Neurostars 上提出此类问题。

    【讨论】:

      【解决方案2】:

      不要循环遍历每个体素,这会非常慢(需要几分钟才能运行)。相反,使用适用于整个数组的 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³")
      

      【讨论】:

        【解决方案3】:

        非常近似的计算:

        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³")
        

        【讨论】:

          猜你喜欢
          • 2013-07-16
          • 2021-04-25
          • 2015-05-09
          • 2011-12-06
          • 1970-01-01
          • 2021-04-21
          • 2018-06-19
          • 2011-10-05
          相关资源
          最近更新 更多