使用 FSL 和 TrackVis 分析 DTI 数据

转载原文
使用 FSL 和 TrackVis 分析 DTI 数据
Alex / 2018-05-21 / [email protected]
弥散加权成像(Diffusion Weighted Imaging, DWI)通过测量水分子的弥散程度来反映水分子所处的
组织结构特点,弥散张量成像(Diffusion Tensor Imaing, DTI)通过张量模型来定量地刻画水分子的弥
散程度,也是最简单的一种模型。作为初学者,总结一下使用 FSL 和 TrackVis 进行 DTI 数据分析的基
本方法,包括涡流/头动校正(eddy current/head motion correction)、张量拟合(tensor fitting)和确
定性纤维束追踪(deterministic tractography)。
一、原始数据准备
(1)将从磁共振扫描仪上采集的原始数据转换成 NIFTI 格式,可以使用 dcm2nii 或者 MRIConvert;
(2)假设转换成 NIFTI 格式后的数据名为 dti_data.nii.gz,此外还会生成两个文本文件,分别表示磁场
梯度施加的强度和方向,这里假设这两个文件分别命名为 bvals 和 bvecs。这两个文本文件的内容如下:
bvals:
bvecs:
(3)bvals 和 bvecs 这两个文件表示什么意思?DWI 的大致原理是在不同方向上施加一个梯度磁场,这
个梯度磁场的强度用 b-value 来表示,b-value 越大、水分子弥散的距离越大、图像信号变化越明显;
DTI 模型总共需要估计六个参数,所以至少需要在 6 个不同方向上施加梯度,梯度方向用 b-vector 来表
示;还需要至少一个没有施加梯度的图像作为参考,常称为 B0 像。上面的 bvals 文件总共 1 行 65 列,
表示总共采集了 65 个图像,第 1 个图像的 b-value 是 0,后 64 个图像的 b-value 是 1000;bvecs 文件
总共有 3 行 65 列,表示在每个图像上所施加的梯度方向。
(4)B0 图像和 DWI 图像:
上图是数据中的前四个图像,第一个图像是 B0 像,后三个图像是 DWI 像,虽然 b-value 都是 1000,但
是梯度方向不同,因此图像信号也会有变化。
二、涡流/头动校正
在拟合张量模型之前,需要对图像进行一些涡流和头动校正,这里使用的是 FSL 5.0.11。
(1)脑提取
脑提取的目的就是为了获得一个(去除颅骨后)脑的 mask,可以使用如下命令:
fslroi dti_data.nii.gz b0.nii.gz 0 1
bet b0.nii.gz b0_brain.nii.gz -m -f 0.3
(2)acqparams.txt 和 index.txt
新建一个名为 acqparams.txt 的文本文件,内容为 0 1 0 0.05,该文件描述的是图像采集的信息。根据
FSL 官网的文档,该文件的正确性与否并不重要,在大多数情况下使用上面的设置即可。另外,正确地
填写这些信息需要对扫描参数有更深入的了解;新建一个名为 index.txt 的文本文件,方法为:
indx=“”
for ((i=1; i<=65; i+=1))
do
indx=“$indx 1”;
done
echo $indx > index.txt
上述代码的作用就是新建一个一列全为 1 的数,并保存到 index.txt 文件中;这个文件中的 1 表示该图像
采集的参数对应于 acqparams.txt 文件的第一行。由于 acqparams.txt 里只有一行,所以所有图像都是
1。
(3)涡流/头动校正
eddy_openmp --imain=dti_data.nii.gz --mask=b0_brain_mask.nii.gz
–acqp=acqparams.txt --index=index.txt --bvecs=bvecs --bvals=bvals
–out=eddy_corrected_data
eddy_corrected_data.nii.gz 即为涡流/头动校正后的数据,eddy_corrected_data.eddy_rotated_bvecs
为头动校正后的 b-vector 文件。
三、张量拟合
dtifit -k eddy_corrected_data.nii.gz -o dti -m b0_brain_mask.nii.gz
-r eddy_corrected_data.eddy_rotated_bvecs -b bvals --save_tensor
张量拟合结束后就可以得到一些定量指标,比如 FA(Fractional Anisotropy)和 MD(Mean
Diffusivity):
FA 反映的是组织结构的方向性,如果水分子的弥散运动在某些方向上受到阻碍,在另一些方向上不受阻
碍,则 FA 较大;FA 较大的地方主要是在白质部分。MD 表征水分子在所有方向上的平均弥散距离,如
果没有受到阻碍,则 MD 较大;MD 较大的地方主要在脑脊液。Color FA 的计算方法是第一个特征向量
(first eigenvector, 文件名为 dti_V1.nii.gz)乘上 FA;第一个特征向量被认为反映(一个体素内)纤维
束的平均方向,所以 Color FA 表示 FA 较大的区域的纤维束的方向。一般地,红色表示左右(X 轴),
绿色表示前后(Y 轴),蓝色表示上下(Z 轴)。
四、确定性纤维束追踪
纤维束追踪就是重建出神经纤维束,分为确定性纤维束追踪和概率纤维束追踪两种类型,纤维束追踪需
要对人脑的纤维束有相当的先验知识(而我没有这样的先验知识)。这里使用 TrackVis 进行确定性纤维
束追踪。由于纤维束追踪是根据张量拟合的结果进行的,我现在还不清楚是否可以用 FSL 的拟合结果来
作为 TrackVis 的输入,因此需要用 TrackVis 重新进行张量拟合并在此基础上进行确定性纤维束追踪。
TrackVis 实际上包含两个相对独立的软件,一个是 TrackVis 用于可视化,一个是 Diffusion Toolkit 用
于张量拟合和纤维束追踪,这里不做区分。
(1)准备文件
由于 TrackVis 不能进行涡流/头动校正,使用 FSL 的校正后的结果作为输入。另外,TrackVis 的 b-
vector 的格式不同于 FSL,首先 FSL 的 b-vector 的格式是每列表示一个梯度方向,TrackVis 是每行表
示一个梯度方向,其次 TrackVis 需要去掉 b-value 为 0 所对应的梯度方向。下面是一个简单的 R 脚本,
将 FSL 的 bvecs 转换为 TrackVis 的格式:
tmp <- as.matrix(read.table(‘eddy_corrected_data.eddy_rotated_bvecs’));
tmp <- t(tmp); ## transpose the matrix
tmp <- tmp[-1,]; ## remove the b0 rows
write.table(tmp, ‘trackvis_bvecs’, row.names=FALSE, col.names=FALSE);
上图即为修改后的 bvecs
(2)张量拟合
dti_recon “eddy_corrected_data.nii.gz” “trackvis” -gm “trackvis_bvecs”
-b 1000 -b0 1 -ot nii.gz
gm 选项指定 b-vector 文件,b 选项表示 b-value,b0 选项表示有多少个 b0 图像。FSL 和 TrackVis 的
张量拟合结果有微小的差异(大约小数点后第三位)。
(3)全脑纤维束追踪
dti_tracker “trackvis” “tmp.trk” -at 35 -m “b0_brain_mask.nii.gz”
-m2 trackvis_fa.nii.gz 0.2 -sl -it nii.gz
spline_filter “tmp.trk” 1 “trackvis.trk”
m 选项表示将追踪限制在脑 mask 内,m2 选项表示将追踪限制在 FA 大于 0.2 的区域;spline_filter 对
追踪结果做一些平滑。在命令行输入 trackvis trackvis.trk,即可查看追踪结果:
(4)基于 ROI 纤维束追踪
上图是全脑的纤维束追踪结果,对于纤维束追踪的原理我现在还是模糊的,我当前的理解是,以每一个
体素为起点(seed),都可以得到一条重建的纤维,那么以所有体素为起点的结果叠加在一起即为全脑
的追踪结果。如果只想看到通过特定 ROI 的纤维束,可以使用该 ROI 作为过滤器,去除不感兴趣的纤维
束。这里假设我感兴趣的区域是大脑白质,我通过对 T1 加权像进行分割和配准得到白质的 mask,即白
质 ROI,实现代码如下:

去除 T1 像的颅骨

bet t1.nii.gz t1_brain.nii.gz

将 T1 像分割成灰质、白质和脑脊液三类

fast -t 1 -n 3 -H 0.1 -I 4 -l 20.0 -o t1 t1_brain.nii.gz
fslmaths t1_pve_2.nii.gz -thr 0.5 -bin wm_mask.nii.gz

使用 BBR 配准,将 B0 像配准到 T1 像

flirt -ref t1_brain.nii.gz -in b0_brain.nii.gz -dof 6 -omat b02t1_init.mat
flirt -ref t1_brain.nii.gz -in b0_brain.nii.gz -dof 6 -cost bbr
-wmseg wm_mask.nii.gz -init b02t1_init.mat -omat b02t1.mat -out b02t1Warp

将 T1 的白质 mask 转换到 B0 像空间

convert_xfm -omat t12b0.mat -inverse b02t1.mat
flirt -in wm_mask.nii.gz -ref b0_brain.nii.gz -out wm_maskWarp -init t12b0.mat
-applyxfm -interp nearestneighbour

将白质 mask 缩小,减少配准误差的影响

fslmaths wm_maskWarp -ero wm_mask_ero
在 TrackVis 的菜单栏选项 ROI -> New ROI From Nifti/Analyze Image,选择上一步得到的白质 ROI
mask,即 wm_mask_ero.nii.gz;在 TrackVis 的右侧的 Property 界面,选择 ROI Filters -> Toggle
Existing ROI,即得到通过白质 ROI 的纤维束:
上述做法是先做出全脑的纤维束,然后使用 ROI 过滤掉不感兴趣的部分;也可以在做纤维束追踪的时候,
将起点限制在 ROI 里,也就是只从 ROI 里的区域出发来重建纤维束,代码如下:
dti_tracker “trackvis” “tmp.trk” -at 35 -m “b0_brain_mask.nii.gz”
-m2 trackvis_fa.nii.gz 0.2 -sl -it nii.gz -sm wm_mask_ero.nii.gz
spline_filter “tmp.trk” 1 “wm_seed.trk”
五、小结
总结了使用 FSL 进行涡流/头动校正、张量拟合,以及使用 TrackVis 进行确定性纤维束追踪的基本方法。
这些方法都是来自于 FSL 和 TrackVis 的官方文档(TrackVis 的文档不够详细)。对于原理的理解上,
还非常粗浅,有些理解完全是个人的猜测,需要进一步确认。因此,多有谬误,敬请指正。

你可能感兴趣的:(linux)