【问题标题】:Python program to calculate voxel count计算体素数的 Python 程序
【发布时间】:2020-03-24 00:31:03
【问题描述】:

我想编写一个脚本来使用 python 计算体素计数。我有一个名为 "PET-CT" 的主文件夹,在这个主文件夹内有 100 个名为 "mrn" 的子文件夹>12345, 43523, 73092,.......每个子文件夹里面还有另外3个"followup" 名为 11, 12, 13 的子文件夹,在这些文件夹内有 2 个名为 "Roi_xyz.nii.gz"“pet_xyz.nii.gz”.

我编写了一个代码来计算任何单个文件夹的体素计数。我想知道是否有人使用python轻松实现使其自动化。请帮我编写一个自动 python 脚本来计算 voxel_count,它会为上述每个文件生成两个文件(如 'uptake_ratio_12345_12.csv' 和 'copy_pet_12345_12.nii.gz')相应的文件夹。它必须遍历这些多个文件夹和子文件夹并保存两个结果。如果它没有找到任何给定的文件,它必须处理到下一个文件夹。

这里是单个文件夹的代码:

import nibabel as nib
import numpy as np
import pandas as pd

mrn='12345'
followup='12'
rootdir= "C:/Users/ak/Downloads/PET-CT"

fdir=os.path.join(rootdir,mrn,followup)

roi = nib.load(os.path.join(fdir,'ROI_xyz.nii.gz'))
pet = nib.load(os.path.join(fdir,'pet_xyz.nii.gz'))

copy_pet = nib.Nifti1Image(pet.get_fdata(),pet.affine)
nib.save(copy_pet,'copy_pet_12345_12.nii.gz')

roi_indices, roi_counts = np.unique(roi.get_fdata(), return_counts=True)

avg_count = roi_counts[1:].mean()

uptake_ratio = (roi_counts/avg_count)

df = pd.DataFrame({'ROI': roi_indices[1:], 'Counts': roi_counts[1:], 'UptakeRatio': uptake_ratio[1:]}) 

# saving the dataframe 
df.to_csv('uptake_ratio_12345_12.csv')  ```

【问题讨论】:

    标签: python loops neuroscience nibabel iterated-function


    【解决方案1】:

    鉴于您的文件夹结构,此代码将遍历所有子文件夹 ./[rootdir]/[mrn]/[followup]/ 并处理所有数据(如果两个文件都可用)。

    import os
    import nibabel as nib
    import numpy as np
    import pandas as pd
    
    rootdir = "./PET-CT/"
    
    # Search all mrn folders on level ./[rootdir]/..
    for mrn in os.listdir(rootdir):
        # Search all followup folders on level ./[rootdir]/[mrn]/..
        for followup in os.listdir(os.path.join(rootdir,mrn)):
            try:
                # YOUR CODE
                fdir=os.path.join(rootdir,mrn,followup)
                roi = nib.load(os.path.join(fdir,'ROI_xyz.nii.gz'))
                pet = nib.load(os.path.join(fdir,'pet_xyz.nii.gz'))
    
                copy_pet = nib.Nifti1Image(pet.get_fdata(),pet.affine)
                nib.save(copy_pet,'copy_pet_{}_{}.nii.gz'.format(mrn,followup))
    
                roi_indices, roi_counts = np.unique(roi.get_fdata(), return_counts=True)
    
                avg_count = roi_counts[1:].mean()
    
                uptake_ratio = (roi_counts/avg_count)
    
                df = pd.DataFrame({'ROI': roi_indices[1:], 'Counts': roi_counts[1:], 'UptakeRatio': uptake_ratio[1:]}) 
    
                # saving the dataframe 
                df.to_csv('uptake_ratio_{}_{}.csv'.format(mrn,followup))
            except:
              print("An exception occurred when processing folder {}".format(fdir))
    

    根据您的描述,我不清楚将新输出存储在哪里。如果您想存储启动 python 应用程序的文件,一切都很好。 否则你必须改变路径。下面我添加了当您的输出文件需要存储在与输入文件相同的文件夹中时的更改。

    nib.save(copy_pet,os.path.join(fdir, 'copy_pet_{}_{}.nii.gz'.format(mrn,followup)))
    ...
    df.to_csv(os.path.join(fdir,'uptake_ratio_{}_{}.csv'.format(mrn,followup)))
    

    【讨论】:

      猜你喜欢
      • 2020-03-19
      • 1970-01-01
      • 1970-01-01
      • 2016-08-10
      • 2022-01-21
      • 2015-04-17
      • 1970-01-01
      • 2011-05-05
      • 1970-01-01
      相关资源
      最近更新 更多