FSL+python的fMRI数据处理

本文分享了一种使用Python处理fMRI数据的方法,通过调用FSL命令行工具实现数据预处理,包括头动校正、配准、标准化等步骤,并提供了实际代码示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

不不不不太想用matlab写代码。。。。。。找了很久基于python的处理fMRI的包,找到了用起来总时出错。有兴趣可以看下fslpy。看了下源码,就是把fsl的命令行用python封装的,而且功能上也是阉割版的。放fslpy包的源码:  

import fsl.utils.assertions as asrt
from . import wrapperutils  as wutils


[docs]
@wutils.fileOrImage('src', 'ref', 'out', 'wmseg', 'fieldmap', 'fieldmapmask')
@wutils.fileOrArray('init', 'omat', 'wmcoords', 'wmnorms')
@wutils.fslwrapper
def flirt(src, ref, **kwargs):
    """Wrapper for the ``flirt`` command.

    The ``twod`` argument may be used in place of the ``2D`` command line
    option.
    """

    asrt.assertIsNifti(src, ref)

    argmap = {
        'twod' : '2D'
    }

    valmap = {
        'usesqform'    : wutils.SHOW_IF_TRUE,
        'displayinit'  : wutils.SHOW_IF_TRUE,
        'noresample'   : wutils.SHOW_IF_TRUE,
        'forcescaling' : wutils.SHOW_IF_TRUE,
        'applyxfm'     : wutils.SHOW_IF_TRUE,
        'nosearch'     : wutils.SHOW_IF_TRUE,
        'noclamp'      : wutils.SHOW_IF_TRUE,
        'noresampblur' : wutils.SHOW_IF_TRUE,
        '2D'           : wutils.SHOW_IF_TRUE,
        'v'            : wutils.SHOW_IF_TRUE,
    }

    cmd  = ['flirt', '-in', src, '-ref', ref]
    cmd += wutils.applyArgStyle('-', argmap=argmap, valmap=valmap, **kwargs)

    return cmd

感觉灵活度还不如fsl命令行。

看了下大佬的视频https://www.bilibili.com/video/av62974174/

就是把fsl命令+matlab或者python调用命令行就ok了

具体怎么操作看大佬视频。

不多说,我直接贴我的代码:

import  os

func_image_path = '/home/ALL/SSD/wuxiuwen/fmri_image'
t1_image_path = '/home/ALL/SSD/wuxiuwen/t1_image'
f_names = os.listdir(func_image_path)
f_names.sort()

t1_names = os.listdir(t1_image_path)
t1_names.sort()
func_image = [func_image_path + '/'+f_name for f_name in f_names ]
t1_image = [t1_image_path + '/'+t1_name for t1_name in t1_names ]


MNI152_image = '/usr/share/fsl/5.0/data/standard/MNI152_T1_2mm.nii.gz'
MNI152_image_brain =  '/usr/share/fsl/5.0/data/standard/MNI152_T1_2mm_brain.nii.gz'
eye_mask = '/home/ALL/SSD/wuxiuwen/MNI152_T1_2mm_eye_mask.nii'

func_image_r_path = '/home/ALL/SSD/wuxiuwen/fmri_head_motion'
func_image_r = [func_image_r_path+'/'+f_name[0:-4]+'_r.nii.gz' for f_name in f_names]

func2T1w_mat_path = '/home/ALL/SSD/wuxiuwen/func2T1w_mat'
func2T1w_mat = [func2T1w_mat_path+'/'+f_name[0:-4]+'_mat.mat' for f_name in f_names]

T1w2MNI_mat_path = '/home/ALL/SSD/wuxiuwen/T1w2MNI_mat'
T1w2MNI_mat = [T1w2MNI_mat_path+'/'+f_name[0:-4]+'_mat.mat' for f_name in f_names]

T1W2MNI_warp_path = '/home/ALL/SSD/wuxiuwen/warp'
T1W2MNI_warp = [T1W2MNI_warp_path+'/'+f_name[0:-4]+'_warp.nii.gz' for f_name in f_names]

final_fmri_path = '/home/ALL/SSD/wuxiuwen/final_fmri'
final_fmri = [final_fmri_path+'/'+f_name[0:-4]+'_final.nii.gz' for f_name in f_names]

eye_path = '/home/ALL/SSD/wuxiuwen/eye'
eye = [eye_path+'/'+f_name[0:-4]+'_eye' for f_name in f_names]



for i in range(54):

    cmd = 'mcflirt -in '+func_image[i]+' -refvol 0 -mats -plots '+'-o ' +func_image_r[i]
    os.system(cmd)

    cmd1 = 'flirt -ref '+t1_image[i]+ ' -in ' +func_image_r[i]+ ' -dof 6 -omat ' +func2T1w_mat[i]
    os.system(cmd1)

    cmd2= 'flirt -ref '+MNI152_image_brain+ ' -in ' +t1_image[i]+ ' -omat ' +T1w2MNI_mat[i]
    os.system(cmd2)

    cmd3 = 'fnirt --in=' +t1_image[i]+' --aff='+T1w2MNI_mat[i]+' --cout='+T1W2MNI_warp[i]+' --config=T1_2_MNI152_2mm'
    os.system(cmd3)

    cmd4 = 'applywarp --ref='+ MNI152_image+ ' --in=' +func_image_r[i]  +' --warp='+T1W2MNI_warp[i]+ ' --premat='+ func2T1w_mat[i]+ ' --out='+ final_fmri[i]
    os.system(cmd4)

    cmd5='fslmaths '+ final_fmri[i]+' -mas '+ eye_mask+' '+ eye[i]
    os.system(cmd5)

把文件路径写好,然后在循环里调用想用的fsl命令行就行了。range(54)的五十四表示我要批量处理的fmri被试数是54,每个被试数据形状:84×84×60×250

改天写个具体的。

反正就是利用os.system()调用fsl命令行。

其实也没啥。

就是不想打开matlab嘻嘻嘻

运行速度超级慢。处理300多个被试花了好几天。

 

 

 

 

评论 12
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值