# 计算全脑的灰质、白质和脑脊液的体积

\[转自52brain]

[原文](http://52brain.com/forum.php?mod=viewthread\&tid=25893\&extra=) [Good ref](https://github.com/zh1peng/structure-mri-notes/tree/bc782ce53e43a77c37189839ae610958a89d90a4/www.fil.ion.ucl.ac.uk/~john/misc/VBMclass10.pdf)

在做VBM分析的时候，经常会把全脑体积（total brain volume=灰质+白质）或是颅内体积(total intracranial volume=灰质+白质+脑脊液)作为无关变量放在第二层的GLM中。 因此计算灰质白质脑脊液的体积就成了一个有用的步骤。 我参照John Ashburner在SPM的mailing list中做的一小段程序，稍作修改（几乎没改）放在此处供大家参考。至于在SPM中如何做VBM，大家可以参考此教程：

如果你用VBM8这一工具包的话，里面会同时生成一个文本文档，里面就有被试的这三种组织的体积。但VBM8估算出的体积和Ashburner的代码估计出的有一些出入，具体可能是计算方法的不同。

```
clear;
cd('Ｄ:\VBM\Dartel\results')　　％数据所在之处
subj=[];
for sub=1:20  %多少个被试
tis=[];
for tissue=1:3,　　　　％三种组织，灰质，白质，脑脊液
        V=spm_vol(sprintf('c%dsubject%02d_T1.nii',tissue,sub))　　％可以是nii格式，也可以是img格式
        Vols=zeros(numel(V),1);
        for j=1:numel(V),
        tot=0;
        for i=1:V(1).dim(3),
            img=spm_slice_vol(V(1),spm_matrix([0 0 i]),V(1).dim(1:2),0);
            img=img(isfinite(img)); %exclude non-finite values
            tot=tot+sum(img(:));
        end;
        voxvol=abs(det(V(1).mat))/100^3 %一个voxel的体积，以升为单位，必须加上这一句
        tot=tot %integral of voxel intensities
        Vols(j)=tot*voxvol
        end
        tis=[tis,Vols]
end
subj=[subj;tis]
end
```

在这里我说一下上面程序的思路。你会发现有脑组织的体素的intensity是1或者接近1.如下图就是第一百层的轴状位的大脑（右侧），虽然它是个图，但本质上是个矩阵（左侧）。你会看到很多地方是0,那是非脑区的地方，也有很多地方是接近1的。矩阵里面向左凹进去那一块其实就是大脑额叶前面凹进去的那部分。

你用这一句也能看到第一百层的矩阵 img=spm\_slice\_vol(V(1),spm\_matrix(\[0 0 100]),V(1).dim(1:2),0);

Ashburner可能假设如果一个体素是1,那么脑组织就占这个体素的百分之百，如果这个体素的intensity是0.5，那么脑组织就占百分之五十。所以把所有的体素加起来就是大脑中的以体素为单位的体积。但体素的大小在每个研究中可能都是不太一样的。尤其是使用c1开头的刚分割完的比较原始的图像时，比如我这个图就是体素大小0.479×0.479×1。所以还要再通过体素的大小换算成具体的毫升或是升等单位。 而这一句`voxvol=abs(det(V(1).mat))/100^3`就是做这个事的。`V（1）`是我们载入的图像本身，在这里是个结构体，而`V(1).mat`是一个仿射转换矩阵（affine transformation matrix），里面记录了体素的大小的信息。det函数做的就是将体素的体积信息提取出来。abs就是看绝对值的，因为det提取出的值可能是负的。

有的同学会问“我是用标准化之前的图像还是标准化之后的图像来计算这个体积？”或者“我是用mudulation之前的还是之后的？”或者“我是用smooth之前的还是之后的”。我用自己的数据算了一下，其实我感觉是这样的。 用**smwc1**开头的文件（经过了标准化，modulation和smooth）和用**c1**开头的文件（刚分割完的原始空间的灰质）来计算的话，灰质的绝对体积值是不一样的。**但是**被试之间的相对体积是非常接近的，四舍五入到小数点后三位数是一样的（由于smooth肯定影响了具体的数值，smooth之前应该更加接近）。

用c1开头的文件算出来的数值依次是

```
0.6083
0.8447
0.6546
0.7670
0.8260
```

用smwc1开头的文件算出来的数值依次是

```
0.6053
0.8408
0.6515
0.7621
0.8217
```

可以看出来还是很接近的。 另外对于同样的5名被试，我还看了VBM8处理后生成的txt文件里面的灰质体积，虽然感觉有点差别，但体积还是基本一致的， 594.832 823.331 633.403 746.745 754.158

我还没有尝试标准化modulation但未smooth的情况。所以我想标准化和modulation并没有保存其绝对体积值，而是保留了相对体积值。

如果你要把体积作为无关变量放在GLM模型中的话用标准化和调制之后的是没有问题的，但要计算绝对体积的话，那个c1开头的图像，就是那个在原始空间的刚刚分割完的图像算出来的体积是最靠谱的。
