DWI预处理模板配准到dwi空间

各位老师同学们好,
我想用Schaefer2018模板计算dwi连接组,我现在有T1数据(1x1x1 mm)和dwi图像(2x2x2 mm)以及1/2mm的模板

我是按照这个方法(见kerstin的回复)把T1w配准到DWI的,这个方法会保持T1的原始分辨率并配准。然后我将2x2x2 Schaefer模板配准到T1w图像上,然后用T1w到dwi变换的变形场对T1w进行变化。

但是,在atlas配准到t1w的过程中,模板被上采样到1x1x1 mm,T1w的DWI的变换的变形场又保持了1x1x1分辨率,导致模板与DWI数据不兼容。这部分代码可以在下面脚本的T1 preprocessing和parcellation registraion中找到。

最后附上完整的脚本供参考。如果代码中有什么问题或者错误,欢迎大家给我指出,谢谢!

提前感谢大家!

DWI preprocessing

mrconvert data.nii dwi.mif -fslgrad bvecs bvals -datatype float32 -info -nthreads 72

dwi2mask dwi.mif - | maskfilter - dilate DWI_mask.mif -nthreads 72 -npass 3 -force -info

dwidenoise dwi.mif dwi_denoised.mif -mask DWI_mask.mif -nthreads 72

mrdegibbs dwi_denoised.mif dwi_denoised_unringed.mif -nthreads 72

dwifslpreproc dwi_denoised_unringed.mif dwi_denoised_unringed_preproc.mif -pe_dir AP -rpe_none -eddy_options " --slm=linear " -nthreads 72

dwibiascorrect ants dwi_denoised_unringed_preproc.mif DWI_bias_ants.mif -bias bias_ants_field.mif -nthreads 72 -force -info

dwiextract DWI_bias_ants.mif - -bzero | mrmath - mean meanb0.nii.gz -axis 3 -force -info

T1 preprocessing

robustfov -i T1.nii -r T1_crop.nii.gz

bet T1_crop.nii T1_brain.nii.gz -R -S

flirt -in meanb0.nii.gz -ref T1_brain.nii.gz -dof 6 -omat tmp.mat

fast -t 1 -n 3 -o structural T1_brain.nii.gz

fslmaths structural_pve_2.nii.gz -thr 0.5 -bin structural_WMseg.nii.gz

flirt -in meanb0.nii.gz -ref T1_brain.nii.gz -dof 6 -cost bbr -wmseg structural_WMseg.nii.gz -init tmp.mat -omat diff_to_structural-bbr.mat -schedule $FSLDIR/etc/flirtsch/bbr.sch

transformconvert diff_to_structural-bbr.mat meanb0.nii.gz T1_brain.nii.gz flirt_import diff_to_structural-bbr-mrtrixformat.txt

mrtransform T1_crop.nii.gz -linear diff_to_structural-bbr-mrtrixformat.txt T1_realign.nii.gz -inverse -interp nearest

mrconvert T1_realign.nii.gz T1.mif

parcellation registraion

flirt -in T1_brain.nii.gz -ref $FSLDIR/data/standard/MNI152_T1_2mm_brain.nii.gz -dof 12 -out T1toMNIlin.nii.gz -omat T1toMNIlin.mat

fnirt --ref=MNI152_T1_2mm --in=T1_brain.nii.gz  --aff=T1toMNIlin.mat --config=T1_2_MNI152_2mm.cnf --iout=T1toMNInonlin.nii.gz --cout=T1toMNI_coef.nii.gz --fout=T1toMNI_warp.nii.gz

invwarp --ref=T1_brain.nii.gz --warp=T1toMNI_warp.nii.gz --out=MNItoT1_warp.nii.gz

applywarp --ref=T1_brain.nii --in=/mnt/Project/template/Schaefer2018_400Parcels_7Networks_order_FSLMNI152_2mm.nii.gz --warp=MNItoT1_warp.nii.gz --out=ind_node7_T1.nii.gz --interp=nn

mrtransform ind_node7_T1.nii.gz -linear diff_to_structural-bbr-mrtrixformat.txt ind_node7_dwi.nii.gz -inverse 

mrgrid ind_node7_dwi.nii.gz regrid -voxel 2,2,2 ind_node_resampled.nii.gz -interp nearest -datatype int32

mrconvert ind_node_resampled.nii.gz ind_node7.mif

FOD and Tractography

5ttgen fsl T1.mif 5tt_coreg.mif -nthreads 72

5tt2gmwmi 5tt_coreg.mif gmwmSeed.mif -nthreads 72

dwi2response dhollander DWI_bias_ants.mif response_wm.txt response_gm.txt response_csf.txt -voxels RF_voxels.mif -nthreads 72 -force -info

ss3t_csd_beta1 DWI_bias_ants.mif response_wm.txt wmfod.mif response_gm.txt gm.mif response_csf.txt csf.mif -mask DWI_mask.mif -nthreads 72 -force -info

mtnormalise wmfod.mif wmfod_norm.mif -mask DWI_mask.mif -check_norm mtnormalise_norm.mif -check_mask mtnormalise_mask.mif -nthreads 72 -force -info

tckgen -act 5tt_coreg.mif -backtrack -seed_gmwmi gmwmSeed.mif -nthreads 72 -minlength 30 -maxlength 250 -cutoff 0.06 -select 20M wmfod_norm.mif tracks_20M.tck

tcksift2 -act 5tt_coreg.mif -out_mu sift_mu_20M.txt -out_coeffs sift_coeffs_20M.txt -nthreads 72 tracks_20M.tck wmfod_norm.mif sift_20M.txt

connectome

tck2connectome -force -symmetric -zero_diagonal -nthreads 72 -assignment_radial_search 2 -scale_invnodevol -tck_weights_in sift_20M.txt tracks_20M.tck ind_node7.mif sc.csv -out_assignment assignments_20M_node_7_20.csv

我现在的做法是把配准后的图谱降采样到2mm,再计算连接。但是现在的做法对原始模板先后进行了上采样(atlas-to-t1)和下采样,这种做法感觉有点对模板改变太大了,有没有什么其他办法可以解决这个问题

我看了一下,实际上就是使用FSL来做的T1和MNI模板、T1和B0之间的配准。你完全可以把这两个配准步骤的结果结合起来,一次性将分区模板从MNI空间转换到B0空间。具体做法,参见FSL官网上的例子(从fMRI到MNI空间,当前的情况就是反过来):https://fsl.fmrib.ox.ac.uk/fsl/docs/#/registration/fnirt/user_guide?id=example-uses,如果你觉得哪里看不懂,我们再讨论。

针对你当前做的尝试,我感觉可以把分区模板换成1mm的,这样精度更高点。然后在使用mrtransform将分区模板从T1空间转换到B0空间的时候,可以添加 -template的选项,这样生成的图像就是2mm的。

感谢老师的回答,我试试看您的解决方法

老师您好,我查了一下fsl的手册
合并配准主要可以通过以下两种方式来做到

applywarp --ref=MNI152_T1_2mm.nii --in=func.nii --out=funcInMNI.nii --warp=warp_struct2mni.nii --premat=func2struct.mat
或者
flirt [‘‘desired options’’] -in ‘‘imageA’’ -ref ‘‘imageB’’ -omat ‘‘transf_A_to_B.mat’’
flirt [‘‘desired options’’] -in ‘‘imageB’’-ref ‘‘imageC’’ -omat ‘‘transf_B_to_C.mat’’
convert_xfm -omat ‘‘transf_A_to_C.mat’’ -concat ‘‘transf_B_to_C.mat’’ ‘‘transf_A_to_B.mat’’
flirt -in ‘‘imageA’’ -ref ‘‘imageC’’ -out ‘‘imageoutput’’ -applyxfm -init ‘‘transf_A_to_C.mat’’

但是考虑到我现在的数据是先T1->diffusion (线性配准得到.mat) 然后mni->T1(非线性得到warp)配准, 好像这两种方法都不适用,可能还是得分开做。

同时我在想 因为我的数据是2mm的,如果用2mm的模板可能更合适一点,如果能在做mni-T1配准的时候能够不改变原始分辨率,然后使用T1w->diffusion的变形场来配准到dwi是不是会好一点。我正在看 Can I register to an image but use higher/lower resolution (voxel size)? 这一部分,希望能找到答案。
而且还有问题是如果做mni-T1配准的时候不改变原始分辨率,那么T1w->diffusion的变形场不知道能不能用在配准后的模板图像上。

再次感谢您的帮助!

  1. 你注意看applywarp的选项(https://fsl.fmrib.ox.ac.uk/fsl/docs/#/registration/fnirt/user_guide?id=applywarp),除了--premat,还有一个是--postmat,所以在你这里就是先应用MNI到T1的非线性变换,再使用T1到B0的线性变换。
  2. 这一点我确实不清楚到底是1mm还是2mm比较好,不过差别应该很小。
  3. 应用配准结果跟分辨率关系不大,只要是在同一个空间就行。

明白了老师,我试试看

按照您的方案,我现在把
applywarp --ref=T1_brain.nii --in=/mnt/Project/template/Schaefer2018_400Parcels_7Networks_order_FSLMNI152_2mm.nii.gz --warp=MNItoT1_warp.nii.gz --out=ind_node7_T1.nii.gz --interp=nn

mrtransform ind_node7_T1.nii.gz -linear diff_to_structural-bbr-mrtrixformat.txt ind_node7_dwi.nii.gz -inverse

mrgrid ind_node7_dwi.nii.gz regrid -voxel 2,2,2 ind_node_resampled.nii.gz -interp nearest -datatype int32

替换为
convert_xfm -omat T1W_to_diff-bbr.mat -inverse diff_to_structural-bbr.mat

applywarp --ref=meanb0.nii.gz --in=/mnt/Project/template/Schaefer2018_400Parcels_7Networks_order_FSLMNI152_2mm.nii.gz --out=ind_node7_T1.nii.gz --warp=MNItoT1_warp.nii.gz --postmat=T1W_to_diff-bbr.mat --interp=nn

得到了2mm分辨率的分割模板,应该可以解决这个问题了,非常感谢!

想请您检查一下这个修改方案是否存在什么疏漏,主要是我调整了ref=meanb0.nii.gz,如果用b0作为ref会不会存在配准不准的情况,我跑了一个人,肉眼看着还不错。

没问题的。我前面说的B0不是特指一个B0图像,而是用来作为配准的目标图像。如果你有多个B0,那么用平均的B0图像是很合理的选择。此外,这个-ref选项只是用来提供分辨率信息等。

明白了,感谢您的帮助 :grinning: