不不不不太想用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多个被试花了好几天。