Python程序计算体素计数

2024-05-20 18:43:55 发布

您现在位置:Python中文网/ 问答频道 /正文

我想用python编写一个脚本来计算体素计数。我有一个名为“PET-CT”的主文件夹,在这个主文件夹中有100个名为“mrn”的子文件夹,123454352373092,。。。。。。。在每个子文件夹中还有另外3个子文件夹名为11、12、13“followup”,在这些文件夹中有2个图像文件名为“Roi\u xyz.nii.gz”“pet\u xyz.nii.gz”

我已经编写了一个代码,用于计算任何单个文件夹中的体素计数。我想知道是否有人有一个简单的实现,使用python使其自动化。请帮助我编写一个自动python脚本来计算体素计数,这将为上述每个文件夹生成两个文件(如“摄取率”12345\u 12.csv和“复制宠物”12345\u 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')  ```

Tags: csvimport文件夹as计数petgzcounts
1条回答
网友
1楼 · 发布于 2024-05-20 18:43:55

给定您的文件夹结构,此代码遍历所有子文件夹./[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)))

相关问题 更多 >