python - 计算体素数的 Python 程序
问题描述
我想编写一个脚本来使用 python 计算体素计数。我有一个名为“PET-CT”的主文件夹,在这个主文件夹内有 100个名为12345、43523、73092的“mrn”子文件夹,......每个子文件夹内还有其他 3 个“后续”子文件夹名为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') ```
解决方案
鉴于您的文件夹结构,此代码将遍历所有子文件夹./[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)))
推荐阅读
- php - 如何使用 cURL 将变量发送到另一个 php?
- rest - 在获取方法 REst Apex 服务 Json 响应中计数记录
- java - Android WorkManager PeriodicWorkRequest 问题 - 应用程序关闭后未运行
- javascript - 在 graphql-yoga 服务器中使用中间件
- docker - 来自守护进程的错误响应:open \\.\pipe\docker_engine_linux: 系统找不到指定的文件
- reactjs - 反应:OSX 上的格式脚本问题
- python-2.7 - 使用 python 2 在 azure devops workitem 中上传 CSV 文件
- python - 压缩数据
- typescript - 将函数作为参数打字稿传递时避免两次参数定义
- python - 从数据帧为 keras 数据生成一个 numpy-ndarray