You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.05 13:16:15