简介这份资源面向神经科学、认知神经科学及医学影像方向的研究人员与研究生提供VBM基于体素的形态学分析软件及配套教程帮助完成MRI数据的自动化形态学分析。VBM作为SPM的重要插件常用于将个体脑图像标准化至MNI空间经配准、分割与灰质密度校正后比较不同个体间的脑结构差异是研究大脑结构变化与疾病机制的实用工具。资源包共21个文件以18个m脚本文件为主另含1个pdf手册、1个txt说明和1个man文件整体约226KB体积轻便便于随SPM环境部署与查阅。其中脚本文件对应vbm2_v1.09等版本的核心功能pdf手册则提供VBM5.1的操作指引可辅助读者理解参数设置与结果解读。目前已有1771人学习下载适合具备MATLAB与SPM基础、希望系统掌握VBM分析流程并动手实践的研究者参考使用。1. VBM 软件下载以及教程从零跑通一条脑结构形态学分析流水线如果你手里有一批 T1 加权结构像想量化灰质、白质的体积或密度差异VBMVoxel-Based Morphometry基于体素的形态学分析几乎是绕不开的一条路。它不依赖手工勾画感兴趣区而是逐个体素做统计比较适合组间差异、纵向随访这类问题。但真正上手时多数人卡在第一步VBM 软件下载以及教程到底该从哪套工具链开始装完又该怎么跑通。常见做法是走 SPM 的 CAT12 工具箱配合 MATLAB 运行也有用 FSL 里 VBM 流程的但生态和教程密度差不少。这篇笔记面向两类人刚拿到数据、还没装环境的新手以及跑过几次但结果不稳定、想搞清楚参数边界的熟手。我会把下载、安装、预处理、统计、排错整条链路拆开讲参数给到能直接抄的程度。2. 环境选型与 VBM 软件下载为什么 CAT12 是当前最稳的起点2.1 三套主流方案对比与选型理由在动手下载之前先把可选路径理清楚否则装到一半发现方向不对返工成本很高。目前做 VBM 常见的有三条路SPM CAT12、FSL-VBM、以及基于 ANTs 的自建流水线。三者定位差别很大。方案运行依赖上手难度组织分割质量适合场景SPM CAT12MATLAB中高含 DARTEL 配准组间差异、纵向、多模态FSL-VBM独立命令行中高中依赖 BET 剥脑大批量、脚本化ANTs 自建命令行高高但需自己拼有工程能力、要定制选 CAT12 的核心理由是它把组织分割、配准、调制、平滑打包成了一条相对成熟的流水线而且默认参数对多数 T1 数据够用。FSL-VBM 的剥脑步骤对参数敏感新手容易在 BET 那一步翻车。ANTs 灵活但你要自己写配准和调制逻辑不适合作为第一条流水线。提示CAT12 是 SPM 的一个工具箱不是独立软件。你必须先有 MATLAB 和对应版本的 SPM再装 CAT12。2.2 下载渠道与版本匹配的硬性约束下载这件事本身不复杂坑在于版本匹配。CAT12 对 SPM 版本和 MATLAB 版本都有要求装错组合会在启动时报一堆函数找不到。常见做法是先确定 MATLAB 版本再选 SPM12最后选与之兼容的 CAT12。三者关系大致是——MATLAB 版本不能太老太老不支持 CAT12 用到的某些函数SPM12 要用较新的维护版本CAT12 用当前稳定版。具体版本号以各自主页的兼容说明为准不要凭记忆装。下载步骤按这个顺序走# 1. 确认 MATLAB 版本在 MATLAB 命令行里执行 version # 2. 下载 SPM12解压到固定路径例如 /opt/spm12 或 D:\tools\spm12 # 下载来源以官方发布页为准不要用来路不明的镜像 # 3. 下载 CAT12解压后整个文件夹放进 SPM12 的 toolbox 目录 # 最终结构应为spm12/toolbox/cat12/ # 4. 启动 MATLAB把 SPM12 加入路径 addpath(/opt/spm12); addpath(/opt/spm12/toolbox/cat12); savepath; # 5. 验证命令行输入 spm 能弹出 SPM 界面再输入 cat12 能弹出 CAT12 界面 spm cat12逻辑说明addpath是把 SPM 和 CAT12 的目录告诉 MATLABsavepath让下次启动仍然有效。第 5 步的验证很关键如果cat12报未定义函数八成是 toolbox 目录层级放错了——CAT12 文件夹必须直接位于spm12/toolbox/下不能多套一层。参数说明路径里尽量不要有中文和空格MATLAB 对含空格路径的处理在某些回调里会出问题。Windows 下建议放在盘符根目录下的英文文件夹Linux 下放在/opt或用户主目录。2.3 首次启动的目录配置与数据准备装完之后别急着跑数据先把 CAT12 的工作目录和数据组织方式定下来。CAT12 默认会在你指定的输出目录下生成mri、surf、report等子文件夹如果输入数据散落在各处输出会非常乱。我一般会这样组织project/ raw/ # 原始 T1每个被试一个 .nii 或 .nii.gz sub-001_T1w.nii sub-002_T1w.nii cat12_out/ # CAT12 输出根目录 stats/ # 统计结果数据准备有两个硬性检查一是图像格式CAT12 吃 NIfTIDICOM 要先转换二是方向信息T1 的 affine 矩阵要正确否则分割会错位。转换 DICOM 可以用 SPM 自带的 DICOM Import也可以用 dcm2niix。# 用 dcm2niix 批量转换 DICOM 到 NIfTI dcm2niix -z y -o ./raw -f %p_%s ./dicom_root-z y表示输出压缩的.nii.gz-o指定输出目录-f是命名模板%p取协议名、%s取序列号。转换完随手抽几个被试在查看器里翻一下确认没有翻转、没有缺层。3. CAT12 预处理全流程从分割到平滑的每一步参数3.1 组织分割与配准的批处理设置预处理是 VBM 最耗时的环节也是最容易出问题的地方。CAT12 的批处理入口在 SPM 界面的 Batch 里选 CAT12 → Segmentation → Segment。核心设置分几块输入文件、输出选项、配准方式。输入文件把所有被试的 T1 加进去。输出选项里VBM 需要的是调制后的灰质、白质图所以勾选GM、WM并选择Modulated输出。配准方式选 DARTEL 或 Geodesic Shooting前者快、后者对形变大的脑更稳常规组间比较用 DARTEL 就够。% 用脚本方式批量跑 CAT12 分割避免手点几百次 % 前提SPM12 和 CAT12 已在路径中 matlabbatch {}; files cellstr(spm_select(FPList, ./raw, ^sub-.*\.nii$)); matlabbatch{1}.spm.tools.cat.estwrite.data files; matlabbatch{1}.spm.tools.cat.estwrite.opts.tpm ... {fullfile(spm(Dir), tpm, TPM.nii)}; matlabbatch{1}.spm.tools.cat.estwrite.output.GM.native 0; matlabbatch{1}.spm.tools.cat.estwrite.output.GM.mod 1; matlabbatch{1}.spm.tools.cat.estwrite.output.WM.mod 1; matlabbatch{1}.spm.tools.cat.estwrite.output.bias.warped 1; matlabbatch{1}.spm.tools.cat.estwrite.extopts.registration.dartel.dartel 1; spm_jobman(run, matlabbatch);逻辑说明spm_select用正则筛出所有被试文件避免手动列。output.GM.mod 1是打开调制这一步决定后续统计的是体积还是密度——调制后反映体积不调制反映密度两者解释完全不同。dartel.dartel 1启用 DARTEL 配准。参数说明opts.tpm指向组织概率图一般用 SPM 自带的TPM.nii不要随意替换。bias.warped 1输出偏置校正后的图像方便肉眼检查分割质量。3.2 用 DARTEL 做组水平配准与调制分割完每个被试会得到自己的组织图但个体脑形态差异大直接比较没意义需要配准到一个共同空间。DARTEL 的思路是迭代生成一个组平均模板再把每个人配过去。流程分两步先Run DARTEL (create Templates)把所有被试的灰质、白质图作为输入生成一组模板再Run DARTEL (existing Templates)把每个被试配到模板并输出流场。% 第一步创建 DARTEL 模板 matlabbatch {}; matlabbatch{1}.spm.tools.dartel.warp.images { cellstr(spm_select(FPList, ./cat12_out, ^rp1.*\.nii$)); cellstr(spm_select(FPList, ./cat12_out, ^rp2.*\.nii$)) }; matlabbatch{1}.spm.tools.dartel.warp.settings.template Template; spm_jobman(run, matlabbatch); % 第二步配准到已有模板并调制 matlabbatch {}; matlabbatch{1}.spm.tools.dartel.mni_norm.template ... {fullfile(./cat12_out, Template_6.nii)}; matlabbatch{1}.spm.tools.dartel.mni_norm.data.subjs.flowfields ... cellstr(spm_select(FPList, ./cat12_out, ^u_rc1.*\.nii$)); matlabbatch{1}.spm.tools.dartel.mni_norm.data.subjs.images { cellstr(spm_select(FPList, ./cat12_out, ^m0wrp1.*\.nii$)); cellstr(spm_select(FPList, ./cat12_out, ^m0wrp2.*\.nii$)) }; matlabbatch{1}.spm.tools.dartel.mni_norm.preserve 1; matlabbatch{1}.spm.tools.dartel.mni_norm.vox [1.5 1.5 1.5]; matlabbatch{1}.spm.tools.dartel.mni_norm.bb [-78 -112 -70; 78 76 85]; spm_jobman(run, matlabbatch);逻辑说明rp1、rp2是分割阶段输出的灰质、白质图DARTEL 用它们建模板。第二步里u_rc1是流场文件m0wrp1是调制后的灰质图。preserve 1表示在配准时保留体积信息这是 VBM 的关键——如果设成 0调制就白做了。参数说明vox是输出体素大小1.5 mm 是常用折中太小文件巨大、太大损失细节。bb是包围盒用默认的 MNI 范围即可除非你的数据覆盖范围特殊。3.3 平滑核选择与平滑操作配准调制完最后一步是平滑。平滑的作用是补偿配准残差、让数据更接近正态分布代价是空间分辨率下降。平滑核大小直接决定你能检测到多细的差异。% 对调制后的灰质图做 8mm FWHM 高斯平滑 matlabbatch {}; matlabbatch{1}.spm.spatial.smooth.data ... cellstr(spm_select(FPList, ./cat12_out, ^sm0wrp1.*\.nii$)); matlabbatch{1}.spm.spatial.smooth.fwhm [8 8 8]; matlabbatch{1}.spm.spatial.smooth.dtype 0; spm_jobman(run, matlabbatch);逻辑说明fwhm [8 8 8]是 8 mm 半高全宽这是 VBM 里最常用的值。dtype 0保持输入数据类型避免精度损失。参数说明平滑核怎么选经验规则是核大小约等于预期差异区域尺度的 2 到 3 倍。研究全脑萎缩用 8 到 12 mm研究小核团用 4 到 6 mm。核越大统计效力越高但定位越糊。这个参数没有唯一正确答案但必须在方法里写清楚且组间比较时所有被试必须用同一个核。4. 统计建模与结果查看把体素差异落到可解释的结论4.1 二阶统计的设计矩阵与对比设置预处理产出的是每个被试的平滑灰质图接下来做组间比较。在 SPM 里选Specify 2nd-level设计矩阵按你的实验设计来。两组比较就是两列一组一列被试归属对应打 1。% 两组比较的二阶统计设置 matlabbatch {}; matlabbatch{1}.spm.stats.factorial_design.dir {./stats}; matlabbatch{1}.spm.stats.factorial_design.des.t2.scans1 ... cellstr(spm_select(FPList, ./cat12_out, ^sm0wrp1_sub-0[0-1].*\.nii$)); matlabbatch{1}.spm.stats.factorial_design.des.t2.scans2 ... cellstr(spm_select(FPList, ./cat12_out, ^sm0wrp1_sub-1.*\.nii$)); matlabbatch{1}.spm.stats.factorial_design.des.t2.dept 0; matlabbatch{1}.spm.stats.factorial_design.des.t2.variance 1; matlabbatch{1}.spm.stats.factorial_design.des.t2.gmsca 0; matlabbatch{1}.spm.stats.factorial_design.des.t2.ancova 0; matlabbatch{1}.spm.stats.factorial_design.masking.tm.tm_none 1; matlabbatch{1}.spm.stats.factorial_design.masking.im 1; matlabbatch{1}.spm.stats.factorial_design.masking.em {}; matlabbatch{1}.spm.stats.factorial_design.globalc.g_omit 1; matlabbatch{1}.spm.stats.factorial_design.globalm.gmsca.gmsca_no 1; matlabbatch{1}.spm.stats.factorial_design.globalm.glonorm 1; spm_jobman(run, matlabbatch);逻辑说明des.t2是两样本 t 检验。variance 1表示假设两组方差相等如果方差不齐改成 2。masking.im 1用隐式掩膜只在有信号的体素里做统计避免背景噪声干扰。参数说明globalc.g_omit 1表示不做全局归一化。VBM 里是否做全局校正有争议——做比较的是相对体积不做比较的是绝对体积。如果两组头围差异大建议做全局校正否则差异可能来自整体脑大小而非局部。4.2 结果阈值与多重比较校正统计跑完看结果最容易被问的就是阈值怎么定。体素级 p 0.001 不校正几乎必然出现大片假阳性。正规做法是做多重比较校正。校正方法特点适用FWE最严控制全脑假阳性小范围强效应FDR较宽松控制假发现比例探索性分析团块级 FWE先设体素阈值再校正团块VBM 最常用VBM 里最常用的是团块级校正体素阈值设 p 0.001未校正团块阈值设 p 0.05FWE 校正。这样既保留灵敏度又控制假阳性。% 查看结果并设阈值 matlabbatch {}; matlabbatch{1}.spm.stats.results.spmmat {./stats/SPM.mat}; matlabbatch{1}.spm.stats.results.conspec.titlestr Patients vs Controls; matlabbatch{1}.spm.stats.results.conspec.contrasts 1; matlabbatch{1}.spm.stats.results.conspec.threshdesc none; matlabbatch{1}.spm.stats.results.conspec.thresh 0.001; matlabbatch{1}.spm.stats.results.conspec.extent 0; matlabbatch{1}.spm.stats.results.conspec.mask.none 1; matlabbatch{1}.spm.stats.results.print pdf; spm_jobman(run, matlabbatch);逻辑说明threshdesc none先不校正thresh 0.001设体素阈值extent 0先不设团块大小跑完在结果界面里再手动加团块级 FWE 校正。print pdf导出结果图。参数说明团块大小阈值不要拍脑袋用 SPM 的Results → 团块级 FWE自动算。报告结果时坐标、团块大小、峰值 T 值、校正 p 值都要写全只写「某脑区有差异」是不合格的。4.3 结果可视化与解剖标注统计结果是一堆坐标和 T 值要变成可读的结论需要叠加到模板上并做解剖标注。SPM 的结果界面可以直接渲染但标注脑区要借助解剖工具箱常见做法是配合 AAL 或 Brodmann 图谱。% 把结果团块坐标导出便于后续标注 % 在 SPM 结果界面点 Results → 选对比 → 设阈值 → 点 table % 团块信息会显示在 MATLAB 命令行可复制保存逻辑说明SPM 的团块表包含每个团块的峰值坐标、团块大小、峰值统计量。把这些坐标拿去和 AAL 图谱对照就能得到脑区名。参数说明MNI 坐标和 Talairach 坐标不要混用SPM 输出的是 MNI 空间。标注时注意左右半球MNI 的 x 负值通常对应左半球但个体差异和配准误差会让边界模糊报告时用「约」「邻近」这类词更稳妥。5. VBM 避坑指南五个让结果不可信的高频问题5.1 分割报告里出现大量「失败」被试现象CAT12 跑完report 里一批被试标红灰质分割明显错位或缺失。原因多数是 T1 对比度差、有严重伪影或者图像方向信息错误。少数是偏置场太强分割算法没收敛。解决先看 report 里的分割预览图确认是数据问题还是设置问题。方向问题用 SPM 的 Display 检查 affine必要时用spm_image重新定位原点。对比度差的被试考虑在 CAT12 里调强偏置校正或者直接剔除——硬跑出来的结果比没有结果更危险。5.2 调制开关设错导致结论方向反了现象统计出来「灰质体积增加」但肉眼看病灶区明明是萎缩。原因调制没开或者 DARTEL 配准时preserve设成了 0。这样统计的是密度而非体积配准把萎缩「拉平」了结论自然反。解决回到预处理检查output.GM.mod是否为 1DARTEL 的preserve是否为 1。已经跑完的重新跑调制和配准不要试图在统计阶段补救。5.3 平滑核与统计阈值不匹配现象结果要么一片空白要么满脑都是「显著」。原因平滑核太小配准残差没被吸收噪声主导或者阈值没做多重比较校正假阳性泛滥。解决平滑核按预期效应尺度选全脑分析用 8 mm 起步。阈值必须做团块级 FWE 校正体素级 p 0.001 只是中间步骤不是最终报告阈值。5.4 全局体积差异没被控制现象两组比较差异遍布全脑看起来「哪都有」。原因两组头围或整体脑体积差异大局部差异被全局差异淹没。解决在设计矩阵里加入全局体积作为协变量或者用globalc.g_omit 0做比例缩放。两种做法各有争议但至少要在方法里说明你怎么处理的不能装作没这回事。5.5 样本量不足硬做组间比较现象结果不稳定换一个阈值结论就变。原因VBM 的效应量通常不大样本量不足时统计效力低结果对参数极度敏感。解决先做效力分析估算需要的样本量。如果数据已经定了就老老实实报告效应量和置信区间不要只挑显著的结果讲。样本量小的时候把结论限定在「探索性」范围内更诚实。6. 把 VBM 结果做扎实的一个进阶习惯从单一体素到网络视角跑通单次 VBM 只是起点。真正让结果站得住脚的是换一个视角看数据——不再只盯着「哪个体素显著」而是问「这些显著体素构成了什么模式」。我自己的习惯是每次拿到团块结果后额外做两件事。第一件是把显著团块映射到已知的脑网络模板上看它们是否落在默认模式网络、感觉运动网络等框架内。这一步不需要额外软件把团块坐标和公开的网络图谱对照即可。如果差异集中在某个网络解释起来比零散脑区更有说服力。第二件是做留一法验证每次剔除一个被试重跑统计看显著团块是否稳定。如果某个团块在剔除任意一个被试后就消失那它大概率是噪声不该写进结论。% 留一法验证的骨架循环剔除被试重跑二阶统计 subs cellstr(spm_select(FPList, ./cat12_out, ^sm0wrp1.*\.nii$)); for i 1:numel(subs) idx true(numel(subs), 1); idx(i) false; % 剔除第 i 个被试 scans subs(idx); % 用 scans 重建设计矩阵并重跑统计 % 记录每次的显著团块最后统计出现频率 end逻辑说明循环里每次排除一个被试用剩余数据重跑统计记录团块是否仍然显著。跑完统计每个团块的「存活率」存活率低的直接放弃。参数说明留一法计算量大被试多的时候可以改成随机剔除 10% 做多次。关键是别只跑一次就下结论VBM 的结果对个体很敏感稳定性检验是后悔药。最后说个血泪经验VBM 的参数没有「标准答案」只有「说清楚」。你用什么平滑核、做不做全局校正、阈值怎么定都要在方法里写明白让别人能复现。我见过太多结果因为参数没交代清楚而被质疑不是分析做错了是没讲清楚。把每一步的选择理由记下来比多跑几个被试更有价值。希望帮到你。本文还有配套的精品资源点击获取
阅读完成 · 觉得有帮助?