如何将20例受试者4D fMRI NIfTI数据导入指定Python预处理代码
多受试者fMRI数据整合实操指南
1. 先搞定必要的Python库
首先确保你装了这两个核心工具:
nibabel:专门读写NIfTI格式的fMRI数据os:Python自带的路径/文件处理工具,无需额外安装
装库命令直接在终端运行:
pip install nibabel numpy
2. 遍历所有受试者文件夹
你的数据结构是每个受试者对应独立文件夹(Sub1、Sub2...),每个文件夹里有单个NIfTI文件。第一步先把所有受试者的文件路径找出来:
import os import nibabel as nib import numpy as np # 定义数据根路径,用原始字符串避免Windows路径转义问题 root_dir = r'F:\New folder\cn_processed data' # 筛选根目录下的所有受试者文件夹 subject_folders = [f for f in os.listdir(root_dir) if os.path.isdir(os.path.join(root_dir, f))] # 按名称排序,保证受试者顺序统一(可选) subject_folders.sort()
3. 读取并整合数据
根据你的预处理代码需求,分两种场景处理:
场景1:把所有受试者数据整合成一个大数组
如果预处理代码需要一次性处理全量数据,可以将每个受试者的4D数据(x,y,z,t)堆叠成5D数组(受试者数, x,y,z,t):
all_subject_data = [] for sub_folder in subject_folders: # 拼接受试者文件夹的完整路径 sub_full_path = os.path.join(root_dir, sub_folder) # 找出文件夹里的NIfTI文件(假设每个文件夹只有一个.nii文件) nifti_files = [f for f in os.listdir(sub_full_path) if f.endswith('.nii')] if not nifti_files: print(f"警告:{sub_folder}文件夹内未找到NIfTI文件") continue # 读取NIfTI文件 nifti_full_path = os.path.join(sub_full_path, nifti_files[0]) img = nib.load(nifti_full_path) data = img.get_fdata() # 将当前受试者数据加入列表 all_subject_data.append(data) # 转换为5D numpy数组 all_data_array = np.stack(all_subject_data, axis=0) print(f"整合后数据形状:{all_data_array.shape}") # 输出应为(20, x, y, z, t)
场景2:逐个处理单个受试者数据
如果你的预处理代码是针对单受试者写的,直接循环遍历处理即可:
# 替换成你的实际预处理函数,输入单受试者4D数据,输出处理后的数据 def preprocess_single_subject(raw_data): # 这里写你的预处理逻辑:比如去漂移、平滑等 processed_data = raw_data # 示例,替换为真实代码 return processed_data # 循环处理每个受试者 for sub_folder in subject_folders: sub_full_path = os.path.join(root_dir, sub_folder) nifti_files = [f for f in os.listdir(sub_full_path) if f.endswith('.nii')] if not nifti_files: print(f"警告:{sub_folder}文件夹内未找到NIfTI文件") continue # 读取原始数据 nifti_full_path = os.path.join(sub_full_path, nifti_files[0]) img = nib.load(nifti_full_path) raw_data = img.get_fdata() # 执行预处理 processed_data = preprocess_single_subject(raw_data) # 保存处理结果 output_dir = os.path.join(root_dir, 'processed_results') os.makedirs(output_dir, exist_ok=True) # 自动创建输出文件夹(不存在时) output_file_path = os.path.join(output_dir, f"{sub_folder}_processed.nii") # 保存为NIfTI格式,必须保留原图像的空间定位信息(affine) processed_img = nib.Nifti1Image(processed_data, img.affine) nib.save(processed_img, output_file_path) print(f"{sub_folder}处理完成,结果已保存至{output_file_path}")
4. 新手避坑提示
- 别手动拼路径:一定要用
os.path.join()拼接路径,避免Windows/Linux系统路径格式冲突 - 检查文件存在:读取前确认文件存在,避免报错中断程序
- 保留空间定位:保存处理后的数据时,必须传入原图像的
img.affine,否则NIfTI文件会丢失空间坐标信息 - 注意内存限制:如果20例数据同时加载到内存导致内存不足,优先选择逐个处理的方式
内容的提问来源于stack exchange,提问作者Abinaya R
相关产品推荐
相关产品推荐

