Python программа для расчета количества вокселей - PullRequest
0 голосов
/ 24 марта 2020

Я хочу написать скрипт для расчета количества вокселей, используя python. У меня есть одна главная папка с именем "PET-CT" , и внутри этой главной папки есть 100 "mrn" подпапка с именем 12345 , 43523 , 73092 , ....... Внутри каждой подпапки есть еще 3 «последующие» подпапка с именем 11, 12, 13 и внутри этих папок находятся 2 файла изображения с именами "Roi_xyz.nii.gz" и "pet_xyz.nii. gz ".

Я написал код для расчета voxel_count из любой отдельной папки. Мне было интересно, есть ли у кого-нибудь простая реализация, использующая python для автоматизации c. Пожалуйста, помогите мне написать автоматический c python скрипт для расчета voxel_count, который приводит к двум файлам (например, 'uptake_ratio_12345_12.csv' и 'copy_pet_12345_12.nii.gz' ) для каждый из вышеуказанных соответствующих папок. Он должен go через эти несколько папок и подпапок и сохранить два результата. Если он не нашел ни одного из указанных файлов, он должен быть обработан в следующую папку.

Вот код для одной папки:

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')  ```

1 Ответ

0 голосов
/ 03 апреля 2020

Учитывая, что ваша папка структурирует этот код go во всех подпапках ./[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)))
...