news 2026/10/4 5:39:06

CAT12与SPM12脑影像VBM/SBM预处理全流程指南

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
CAT12与SPM12脑影像VBM/SBM预处理全流程指南

1. 从原始影像到可统计的脑结构指标:VBM/SBM到底在做什么

写这篇笔记的时候,我刚跑完一批总共 87 例的 T1 结构像数据,用的就是 CAT12 和 SPM12 这套组合。说实话,VBM 和 SBM 这两个词对刚接触脑影像分析的人来说会有点劝退,但它们解决的实际问题其实并不复杂。

拿到一批 T1 加权结构像,我们要回答的最常见问题就是:两组人(比如患者组和对照组)的脑结构有没有差异?差异在哪个脑区?这里的“结构差异”可以是灰质体积、皮层厚度、皮层表面积、脑回皱褶程度等不同维度的指标。VBM(Voxel-Based Morphometry,体素形态学分析)是把大脑配准到同一个标准空间后,逐体素比较灰质/白质体积;SBM(Surface-Based Morphometry,基于表面的形态学分析)则是在皮层表面上重建几何结构,逐顶点比较皮层厚度、表面积等指标。两者的核心逻辑是一样的——消除个体间大脑形状和大小的差异,让不同人的脑可以在同一坐标体系下进行逐点比较。

CAT12(Computational Anatomy Toolbox)是运行在 SPM12 框架下的一个工具包,它把 VBM 和 SBM 的完整流程集成到了一套 GUI 和命令行接口里,省去了大量手工步骤。这也是为什么我推荐新手直接从这个组合入手——MATLAB 装上 SPM12,再把 CAT12 放进 toolbox 目录,准备工作就基本完成了。

这篇笔记主要记录预处理环节。预处理是整个 VBM/SBM 分析里最耗时、最影响结果质量的环节,也是报错最密集的环节。后面几个笔记再写统计分析、结果可视化以及结果解读。

2. 环境搭建与数据准备:装好工具只是第一步

2.1 版本兼容性:MATLAB、SPM12、CAT12 的三角关系

很多人一上来就卡在安装环节。CAT12 目前(r1727 及以后版本)支持 MATLAB R2018b 到 R2022b 系列,SPM12 的官方要求是 MATLAB R2014a 以后,但实际用下来,R2016b 到 R2020b 这个区间最稳。版本太新的 MATLAB(比如 R2023b)在一些老机器上跑 CAT12 偶尔会出现编译层面的兼容问题,尤其是 mex 文件报错,那种错误信息通常是"Cannot find mex file"或者"Undefined function"之类,解决方法一般是用 CAT12 安装目录下的cat_install_mex.m重新编译。

这里我强烈建议,专机专用。准备一台专门跑分析的电脑或服务器,MATLAB 版本固定后就不要随便升级,更不要把 CAT12 多个版本混在同一个路径下。我见过一个用户因为同时保留了 r1361 和 r1727 两个版本,导致函数调用混乱,出现各种莫名其妙的"cat_main"报错,排查了一整天最后发现是路径优先级问题。这是完全可以用规范操作避免的坑。

安装顺序和检查方法其实很简单:

  1. 安装 MATLAB,建议版本 R2018b–R2022b。
  2. 下载 SPM12(官方 GitHub 或官网),解压后放到任意路径,比如D:\toolbox\spm12。
  3. 启动 MATLAB,把D:\toolbox\spm12加入路径,运行spm或spm_jobman('initcfg'),确认 SPM 界面能正常弹出。
  4. 下载 CAT12 包,同样解压,比如放到D:\toolbox\cat12,加入路径。
  5. 在 MATLAB 命令行输入cat12,能弹出 CAT12 的 GUI 窗口就说明安装成功。

一个常被忽略的细节:CAT12 自带了一批示例数据(在cat12\data目录下),碰到环境问题不知道是自己数据的问题还是安装的问题时,用示例数据跑一遍就有答案了。这个思路对后续排查所有问题都有用。

2.2 DICOM 转 NIfTI:别在这一步偷懒

原始扫描仪导出的数据大多是 DICOM 格式,一个序列几十上百个文件,CAT12 不直接处理 DICOM,需要转成 3D NIfTI 文件(.nii)。常用的转换工具有 dcm2niix、MRIcron 自带的 dcm2nii、SPM12 的spm_dicom_convert等。

我个人的建议是用 dcm2niix(GUI 版本是 dcm2nii.exe 或通过 MRIcron 调用)。原因很实际:它重命名规则灵活,能自动识别序列,而且会把翻转参数、空间位置信息处理好。命令行的基本用法是:

dcm2niix -f %p_%s -o /output_dir /input_dicom_dir

其中%p代表患者名,%s代表序列号。实操中更推荐带日期或其他唯一标识的重命名模式,不然 87 个人都叫 "T1_MPRAGE" 的时候你就疯了。我习惯的格式是%i_%p_%s,能同时保留 ID 和序列信息。

转换完成后要做一次穷尽检查,这一步不能省。用fsleyes或 MRIcron 逐一看每个 nii 的朝向对不对、脑组织有没有明显缺失。T1 像的标准朝向是矢状位上看额头朝左、枕叶朝右,轴状位看左脑在图像右侧(放射学朝向)或左侧(神经学朝向),具体取决于写入设置。最关键的是三点:左右是否翻转(可以通过脑结构不对称性判断,或者用 dcm2niix 的默认参数一般不会翻转)、头动伪影是否严重、全脑是否被完整覆盖(部分病例扫描时颈部偏下,导致顶部头皮被截掉,这种数据 VBM 会报错或者结果不可靠)。

2.3 数据目录规范:从第一天就养成好习惯

我个人强烈建议所有原始 nii 文件按照项目名/分组/编号的结构存放,比如:

ADNI/ ├── HC/ │ ├── sub_001.nii │ ├── sub_002.nii └── AD/ ├── sub_003.nii └── sub_004.nii

CAT12 批处理时支持指定文件夹或使用 Cell array 批量选择文件,目录规范清晰能极大减少选错文件的概率。另外,所有路径尽量不要包含中文和空格。我遇到过不止一次,因为路径里含中文导致 CAT12 在生成报告或写数据时异常退出,原因是 MATLAB 的编码和 Java 接口在非英文字符路径上容易出 bug。这个建议是反复被血腥教训验证过的。

3. VBM 预处理全流程拆解:每个选项背后是什么逻辑

3.1 CAT12 的 VBM 主流程:六步合一的简化

在 CAT12 GUI 里,选择Start CAT12后进入主界面,选择VBM选项卡,再点Preprocessing下面的VBM (Estimate and Write),就能看到预处理的主要设置面板。CAT12 把传统 VBM 流程封装成了一个集合操作:偏置场校正、分割、空间标准化、调制、平滑全部跑完,最后输出标准的mwp1*.nii、mwp2*.nii、mwp3*.nii文件。很多新手以为点一下 Start 就行,其实界面里的几个下拉选项和数值才是决定结果质量的核心。

传统 SPM12 的 VBM 流程是:分割 → 空间标准化(DARTEL)→ 调制 → 平滑。CAT12 改进了这一流程,在分割和时间标准化之间的具体实现上使用了一个更有针对性的配准方法(内置了 DARTEL 的高保真版本作为核心配准方式),并把偏置场校正也整合了进来。我的理解是,CAT12 更像是“带质量控制的自动化工厂”,而不是简单的“SPM12 功能包装”。

界面上关键选项有:

  • Affine Registration(仿射配准):通常保持默认 DARTEL。这个选项会把个体脑进行初始配准,把它挪到标准空间的大致位置。
  • SPM12 分割选项:如果选择跳过 CAT12 的优化分割,就会退回 SPM12 默认分割方案,但那样会损失 CAT12 的很多质量改进。
  • Bias FWHM(偏置场正则化):默认 60mm,代表低频强度不均匀性估计所使用的平滑范围。保留默认即可,除非已知扫描仪有严重的偏置场问题。
  • Voxel size for writing(写出的体素大小):默认是 1.5mm,即产物体素大小为 1.5×1.5×1.5mm。如果你想要更高空间分辨率,可以改成 1.0mm,但计算量和存储量会显著上升,统计上也不会带来多少额外收益——标准空间下的灰质体积比较在 1.5mm 下已经足够。

还有一个容易被忽略的选项是Surface and thickness estimation。如果在 VBM 流程中勾选了它,CAT12 会在分割的同时顺带重建皮层表面并计算皮层厚度,相当于一次预处理同时得到 VBM 和 SBM 的产物。我个人非常推荐勾选,因为完全不增加额外扫描成本,只是计算时间变长了(每个人大约多跑 10 分钟),但后续你想做 SBM 的时候就不用重新回去跑预处理了。

3.2 分割、标准化、调制:三个关键环节的原理温习

VBM 预处理的三个核心动作是分割、标准化和调制,CAT12 把它们封装成了一个流程,但我还是建议每一个使用者把这些步骤的数学和物理意义搞明白。否则后期你看到“为什么我的灰质体积结果和文献里的方向相反”这类问题时,会完全没有头绪。

分割(Segmentation)是将每个体素分类为灰质(GM)、白质(WM)、脑脊液(CSF)或其他组织的概率值。CAT12 内部用的是高斯混合模型加先验概率图谱结合的方案,本质上和 SPM12 的 unified segmentation 一脉相承,但 CAT12 在脑部形态异常(比如脑萎缩、脑室扩大)上的鲁棒性更好。分割输出的p1、p2、p3文件分别对应灰质、白质、脑脊液的 3D 概率图,每个体素的取值范围是 0 到 1。

空间标准化(Spatial Normalization)是拿个体脑通过非线性配准映射到 MNI 标准空间。CAT12 默认采用 DARTEL 策略,它会在分割结果的基础上生成一个组的模板(把所有人的灰质/白质图平均起来形成),然后反复迭代配准到模板上。这一步的目的是保证“同一个坐标点在不同人脑上对应的是同一个解剖位置”。

调制(Modulation)这里很多初学者会搞混。调制有两种:默认的“调制”会把体积信息保留下来(乘上雅可比行列式导致的体积变化量),这样每个体素的信号就代表了“该体素在个体原始空间对应的灰质体积”;而“非调制”只保留灰质浓度/密度信息(即该体素灰质概率的相对值)。比如,一个人的整体灰质体积大,在非调制图里每个体素的灰质概率也会系统性偏高,所以在组间比较时非调制图反映的是灰质浓度差异,而调制图反映的才是灰质体积差异。研究报告里通常会写“VBM 灰质体积”或“VBM 灰质浓度”,这两个统计量对应的预处理不同。绝大多数研究用的是调制后的体积指标。

平滑(Smoothing)是把调制后的灰质图用一个高斯核做空间卷积。平滑的核心目的是提高信噪比、满足统计检验中关于误差项正态性的假设,另外也是为了抵消配准后仍然存在的个体间微小解剖差异。平滑核大小(FWHM)的选择有讲究:

  • 过小(比如 4mm):噪声抑制不足,统计结果容易出很多零散的小簇团,可重复性差。
  • 过大(比如 12mm 以上):空间分辨率严重降低,小的解剖结构差异会被抹平,而且会引入边缘伪差。
  • 常用范围是 6–10mm。我自己的选择是 8mm,对灰质体积分析属于比较折中的方案。如果样本量小(每组 20 人以下),可以适当加大到 10mm,提高检验效能。

3.3 运行批处理:怎么同时跑几十上百个被试

数据多了以后,一个一个在 GUI 里点选就太机械了。CAT12 支持用spm_jobman跑批处理。你可以先在一个被试上生成并保存一个 Job 文件(XML/mat 格式),然后写一个简单的循环脚本批量调用。下面是一个我常用的脚本骨架:

% 批量预处理 VBM spm('defaults', 'PET'); spm_jobman('initcfg'); cat12_path = '/path/to/cat12'; addpath(cat12_path); subjects = {'/data/HC/sub_001.nii', '/data/HC/sub_002.nii', ...}; matlabbatch = []; matlabbatch{1}.spm.tools.cat.estwrite.data_src = subjects'; 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.GM.dartel = 0; matlabbatch{1}.spm.tools.cat.estwrite.output.WM.native = 0; matlabbatch{1}.spm.tools.cat.estwrite.output.WM.mod = 0; matlabbatch{1}.spm.tools.cat.estwrite.output.warps = 0; matlabbatch{1}.spm.tools.cat.estwrite.extopts.expertmode = 1; spm_jobman('run', matlabbatch);

实际使用中,我会在脚本里加try-catch并打印每个被试的完成状态,这样跑完能快速看到哪些被试失败了、失败原因是什么。脚本本身不复杂,但跑起来之后你会发现:真正的瓶颈不是脚本,而是计算资源和时间。

预处理耗时取决于被试数量、机器 CPU 核数、是否同时开启表面估计。拿我这台 8 核 16 线程的机器来说,单被试 T1 预处理(含表面重建)大约 15–25 分钟。批量跑 87 个被试大约需要 20 小时以上。这时有两个实用建议:

一是并行。如果你有 MATLAB Parallel Computing Toolbox,可以通过parpool并行处理,但要注意 CAT12 在某些并行组合下容易出随机性的文件写入冲突,我个人反而更推荐用多个 MATLAB 实例(每个实例处理不同分组)或者写 shell 脚本多进程在服务器上跑。每 2 个核心跑一个 MATLAB 任务,比硬上 parpool 稳得多,实测效率也更高。

二是不要中途关机,建议配置自动保存并定期查看日志。如果遇到断电或系统重启导致中断,已经跑完的被试不需要重跑,直接在剩余被试上继续即可。

4. SBM 预处理流程:从灰质图到皮层表面指标

4.1 表面重建与皮层指标的求取

SBM 分析的是皮层表面的几何形态。CAT12 的 SBM 流程核心是把分割后的灰质/白质界面向外扩张重建出一个三角网格样条表面(中表面),然后在这个表面上逐顶点计算皮层厚度、皮层表面积、皮层灰质体积、皮层褶皱指数(即局部回指数)、皮层复杂度(分形维数)等指标。

在 CAT12 GUI 的 VBM 预处理面板,勾选Surface and thickness estimation后,输出文件夹里会多出一系列*.central、*.thickness、*.fractal等文件。其中:

  • sub_XXX_central.nii:中表面文件,是后续 SBM 分析的基础。
  • sub_XXX_thickness.nii:皮层厚度图,单位是毫米,逐顶点数据。
  • sub_XXX_gyrification.nii:局部回指数。
  • sub_XXX_fractal.nii:分形维数。
  • sub_XXX_surface_volume.nii:皮层表面的局部体积。
  • sub_XXX_surface_area.nii:局部表面积。

这些指标的意义差异很大。皮层厚度主要反映树突、神经元数量的变化,对神经退行性疾病敏感;表面积反映皮层的折叠模式,更多受发育期影响,在自闭症、精神分裂症等神经发育相关研究中很常用;回指数反映脑沟回的复杂度和皱褶程度。

4.2 SBM 的平滑与统计准备:网格上的高斯平滑

SBM 数据和 VBM 的体素数据格式不同,它是定义在表面网格顶点上的标量场,因此平滑也是在表面上进行,而不是在三维体素空间。CAT12 提供了一个独立于 VBM 流程的 SBM 处理入口,在 CAT12 主界面选Surface选项卡,可以单独对已经得到的.thickness等文件做平滑、重采样或构造组模板。

SBM 的默认平滑核是 15mm FWHM(在表面上的扩散平滑)。为什么比 VBM 常用 8mm 大这么多?因为表面网格的顶点密度比体素稠密得多,而且皮层厚度指标的空间变化本来就是相对平滑的,较小的核起不到有效去噪的作用。如果样本量小,甚至有文献用 20mm。我个人的做法是:厚度指标用 15mm,面积指标用 15mm,分形维数用 15mm,其实大抵都差不多。这个参数在后续做统计时可以调整,不必过度焦虑。

SBM 预处理还有一个重要环节是中心化(central surface)的质量检查。表面重建受 T1 图像质量影响很大,头动、金属伪影、白质/灰质对比度差等都可能导致表面穿透或拓扑错误。CAT12 在生成表面时会自动计算一个质量分数,输出在cat_*.xml报告里。我通常会在 SBM 分析前把这些 XML 报告批量整理一遍,把质量等级为 C 或 D(极差)的被试直接剔除,或者标记为可疑,等人工复核。

4.3 SBM 与 VBM 的结果对应关系:一个例子

为了说明 VBM 和 SBM 不是重复的分析,这里举一个例子:早期阿尔茨海默病的研究中,VBM 结果显示内嗅皮层和颞叶灰质体积显著减小;SBM 结果显示同一区域的皮层厚度降低,但表面积变化不明显。这说明体积减小主要是由皮层变薄驱动的,而不是皮质表面积缩小——这就是两种方法互补的价值所在。

所以,如果你有条件(机器和时间),我非常建议 VBM 和 SBM 都跑,然后互相印证。CAT12 在一次预处理里同时给出两套产物,算是性价比极高的方案了。

5. 预处理质量检查:这一步不做,后面全是白做

5.1 CAT12 的 QA 模块怎么用

预处理跑完不代表可以直接做统计,CAT12 提供了一个Check sample homogeneity功能,这个模块会在所有被试的灰质图(或皮层指标图)之间做两两相关分析,找出“离群”的被试。它的逻辑很简单:如果某个人和所有人的相似度显著偏低,那这个人大概率在预处理中出了问题,或者本身就是极端解剖结构。

我的流程是:预处理结束后,在 CAT12 主界面选择Check sample homogeneity,选择要检查的指标(比如mwp1*.nii或thickness),同时填入协变量(比如年龄、性别、总脑体积 TIV)。运行完成后,会生成一个 HTML 报告和一个dist_开头的相关图。报告里会列出哪些被试被判定为离群值。离群不是直接删除的理由,但必须重新回到原始影像去看一眼。常见原因包括:头动伪影、扫描期间局部信号丢失、配准失败、灰质分割错误等。如果确实是图像质量问题,再考虑替换或剔除。

5.2 分割质量可视化检查

CAT12 还会生成一个cat_开头的文件夹,里面存放了每个被试的cat_sub_XXX.xml报告文件。这个文件包含了分割的质量评分、脑组织体积估算、表面质量评估等。要快速浏览这些评分,可以用 MATLAB 脚本批量读 XML:

files = dir('/data/CAT12_output/cat_*.xml'); for i = 1:length(files) x = cat_io_xml(fullfile(files(i).folder, files(i).name)); fprintf('%s: IQR = %.4f, WM = %.4f, quality = %s\n', ... files(i).name, x.qualityratings.IQR, x.qualityratings.res_WM, ... x.qualityratings.quality); end

一般要看几个指标:IQR(图像质量等级,越小越好),res_WM(白膜残留/分割误差),以及最终的quality字母等级。A 代表优秀,B 可用,C 和 D 需要处理或剔除。

我建议每个被试都实际看一张分割结果叠加重建的 jpg 图片。CAT12 会在cat_文件夹里自动生成一个sub_XXX_segmentation.png或类似命名的可视化图片,打开快速翻一遍,重点关注颞叶、额叶底部、小脑等分割容易出错的位置。这一步花费的时间不算多,却能避免用坏数据跑完整个统计后再推翻重来。

5.3 TIV(总颅内体积)到底要不要作为协变量

TIV(Total Intracranial Volume)的计算在 SPM12/CAT12 里是通过把灰质、白质、脑脊液的体积相加(或加上其他组织)得到的。TIV 与灰质体积有天然的高度正相关,所以在做 VBM/SBM 统计时,是否把 TIV 纳入协变量,是一个长期争议的问题。

我的建议是:正式分析中默认纳入 TIV 作为协变量(除非研究问题本身关注的就是个体差异相关的绝对体积)。理由很简单:我们需要比较的是区域性的体积/厚度差异,而不是整体脑袋大小的差距。一个总颅内体积 1600mL 的患者内嗅皮层 2.5mL,和一个 1350mL 的健康对照内嗅皮层 2.4mL,直接比绝对值会得到错误结论。纳入 TIV 后,相当于把所有被试的整体脑尺寸差异回归掉,再去看区域性的附加差异。

预处理阶段不需要做统计,但需要把 TIV 保存好。CAT12 会在 XML 报告里输出eTIV或TIV值,你可以批量提取到 Excel/CSV 备用。提取脚本也不复杂,本质上就是读 XML 取字段。

6. 常见问题与排查技巧实录

以下问题全部来自我自己和同事实际跑数据时踩过的坑,按发生频率排序,整理成速查表。

6.1 预处理报错与对策速查表

报错或现象常见原因解决办法
Error using spm_run_normalise或Cannot find a valid initial transformation初始配准失败,数据质量太差、朝向错误、颅骨被裁剪检查 nii 朝向和覆盖范围;用 FSLeyes 查看是否有明显头部截断;剔除严重坏数据
ERROR: No valid voxels in segmentation图像全黑或信息缺失,可能是 DICOM 转换错误回看原始 DICOM,重新转换;检查 nii 的 intensity 分布
Cannot create surface / Surface creation failed灰白质对比度太差或脑区严重萎缩,表面重建中拓扑修复失效检查 T1 图像质量;可尝试在 CAT12 中关闭“Use intensity”等表面优化选项;必要时排除被试
MATLAB 直接崩溃或内存不足机器 RAM 不够(单被试预处理峰值可能占 8GB 以上),或开了过多 MATLAB 实例关闭不必要的应用;减少并行实例数;增加 swap;考虑用服务器跑
输出只有p1、p2、p3,没有mwp1勾选了 Native 或调制选项设置不对在 VBM 预处理面板确认输出 GM 的 modulated 选项为 1;或在 jobman 脚本中设置output.GM.mod = 1
所有被试的灰质体积都非常大或非常小调制没有正确执行,或模板选择错误确认调制选项;检查是否误用了 pediatric 或 lifespan 模板
同一个被试跑出来的结果两次不一样有随机初始化,或 CAT12 版本不同,或并行写入冲突检查是否同时有两个 MATLAB 实例处理同一份数据;固定版本并重跑验证

6.2 几个实操心得

关于模板选择。CAT12 默认模板是面向成人的。如果你的样本是儿童(比如 8 岁以前)或严重萎缩的老年人,可以在预处理时改用Template选项里的XM 0-1(发育模板)或Lifespan模板。这是一个很多人忽略的细节,但对结果的解剖准确性影响很大。我曾经用默认模板处理一alle 5-6 岁儿童的数据,结果颞叶和额叶区域的配准质量明显差于使用儿童模板的版本。

关于肌肉骨骼影响的处理。CAT12 在分割时默认会把头部之外的体素归为“其他组织”,但颈部组织、眼球、脂肪如果强度偏高,可能会干扰偏置场校正,导致分割不准确。因此,在预处理前可以使用CAT12自带的质量控制选项,或手动裁剪掉颈部的多余层面。这个操作只影响配准和分割的输入,不会影响大脑本身的信号。

关于批次效应。如果不同组被试是不同时间段、不同扫描仪采的,预处理后的数据可能带有明显的中心效应/批次效应。预处理阶段能做的有限,但至少你应该在分组列表里记录扫描仪型号和扫描参数,后期统计分析时作为协变量或使用 ComBat 系列方法做批量校正。千万别忽略这一点,我见过太多因为批次混杂导致假阳性结果的文章。

关于 Y 轴反转问题。使用某些第三方转换工具或从某些数据库导出的 NIfTI 文件,可能会出现神经学朝向和放射学朝向混用的情况。VBM 统计本身对镜像翻转并不敏感,但对 SBM 的左右半球拓扑会产生影响。务必在预处理前用标准空间模板对比一下左右半球位置,或者直接看侧脑室形态是否正常。

7. 一个完整的最小运行示例

最后,给一个可以直接跑通的完整脚本示例。它适用于:单个或多个被试的 T1 预处理,生成 VBM 的调制灰质产物,同时开启表面估计和厚度计算。假设你的数据放在/data/raw/下面,输出到/data/cat_out/。

% CAT12 VBM + SBM 预处理批处理脚本 % 环境初始化 spm('defaults', 'FMRI'); spm_jobman('initcfg'); addpath('/path/to/cat12'); % 数据列表 raw_dir = '/data/raw'; subjects = { fullfile(raw_dir, 'HC_001.nii') fullfile(raw_dir, 'HC_002.nii') % ... 把所有被试加进来 }; % 创建输出目录 out_dir = '/data/cat_out'; if ~exist(out_dir, 'dir'), mkdir(out_dir); end % 构建批处理任务 matlabbatch = []; matlabbatch{1}.spm.tools.cat.estwrite.data_src = subjects; % 输出设置 matlabbatch{1}.spm.tools.cat.estwrite.output.GM.native = 0; matlabbatch{1}.spm.tools.cat.estwrite.output.GM.mod = 1; % 调制灰质(VBM主力) matlabbatch{1}.spm.tools.cat.estwrite.output.GM.dartel = 0; matlabbatch{1}.spm.tools.cat.estwrite.output.WM.native = 0; matlabbatch{1}.spm.tools.cat.estwrite.output.WM.mod = 0; matlabbatch{1}.spm.tools.cat.estwrite.output.warps = 0; % 不使用DARTEL流场 % 表面估计 matlabbatch{1}.spm.tools.cat.estwrite.output.surface = 1; % 预处理参数 matlabbatch{1}.spm.tools.cat.estwrite.opts.tpm = {fullfile('/path/to/cat12/templates_1.50mm/TPM.nii')}; matlabbatch{1}.spm.tools.cat.estwrite.opts.affreg = 'mni'; matlabbatch{1}.spm.tools.cat.estwrite.extopts.expertmode = 1; % 关闭专家模式提示 % 运行 try spm_jobman('run', matlabbatch); fprintf('预处理任务全部完成。\n'); catch ME fprintf('预处理出错: %s\n', ME.message); end

实际上,不同人使用的 CAT12 版本在 jobman 字段名上可能有细微差别。建议在 GUI 上先点一次,把任务保存为.matjob 文件,再修改这个 job 文件里的data_src列表来生成你自己的批处理脚本。这个办法最稳,不会因为字段写错导致重复调试。

跑完后,检查/data/cat_out是否生成了mwp1*.nii、cat_*.xml、*.central、*.thickness等文件。齐了,说明预处理基本通过;没齐,就回到第 5 节的质量检查环节一步步排查。

8. 一些小技巧与后续计划

在这个第 1 篇笔记的末尾,补充几个我在实际使用中最想提醒自己的点:

一是在处理大规模数据前,先用 3–5 个被试完整跑一次流程,检查输出文件和计算时间,确认没问题后再全量跑。这能帮你避免在批量跑完 80 个被试后才发现参数设错了。

二是时刻保留原始数据备份。CAT12 的预处理并不修改原始 nii,但它会在源目录下生成大量中间文件。保持原始目录只读,或者至少把原始数据另外复制一份,能让你随时可以重跑。这个习惯在投稿被要求重新分析时救过我好几次。

三是对 SBM 结果多做表面可视化检查。体素结果看起来正常不代表表面结果就没问题,皮质厚度分布有明显的解剖学规律——比如中央前后回的厚度相对较大、岛叶和扣带回也偏厚。如果看到一片区域厚度值明显异常(比如超过 6mm),大概率是表面重建中出现了拓扑错误,这类个体在统计前就要标记出来。

四是不要嫌麻烦,把所有被试的预处理报告存档。CAT12 的 XML 文件本身就是很好的质量记录,投稿或写数据说明的时候可以直接引用。我会按项目建一个QA_Reports文件夹,把每个被试的 XML 复制进去,同时写一个quality_summary.csv汇总质量等级、TIV、灰质体积等关键值。

这个系列打算继续写下去。后面我计划整理:基于 CAT12 的 VBM 组间比较完整流程(含协变量设置与多重比较校正)、SBM 统计分析(含顶点水平的 GLM 和 TFCE)、结果的女性化可视化方案,以及如果不用 MATLAB,有哪些 Python 替代方案(比如 fMRIPrep + FreeSurfer、DeepBrainNet 等)可以做等效的形态学分析。每次更新都会基于我实际跑数据的经验,不是为了凑系列而写,是真的踩过坑、跑通过流程。

这次关于数据预处理的笔记就先写到这里。最后再分享一个我觉得最有用的习惯:每次预处理完,花半小时对所有被试的灰质图(或厚度图)做一个简单的“平均图”,用 FSLeyes 或 CAT12 自带查看器打开,如果平均图的灰质边界清晰锐利,说明配准和分割质量整体不错;如果边缘模糊成一片,说明有相当比例的被试处理不到位。这个一两分钟的人工检查比任何统计指标都直观,也能在你陷入浩如烟海的质量数值时,帮你快速建立对这批数据的整体信心。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/10/4 5:38:52

C语言链表多文件工程化实践:从单文件到可维护模块

1. 为什么非得把链表拆到多个.c文件里?——从“能跑”到“能维护”的分水岭你写过链表吗?大概率是这样:一个 main.c 文件,里面塞着 struct node 定义、malloc/free 调用、insert/delete 函数、还有几十行测试代码。编译命令就一句…

作者头像 李华
网站建设 2026/10/4 5:33:45

Logisim数据表示实验全解析:从补码运算到超前进位

我们当年做《计算机组成原理》这门课的时候,几乎每个人都在Logisim里搭过电路。尤其是educoder平台上的“计算机数据表示实验”,看起来只是几个小关卡,但如果你只是照着填空、连线,不往深处想一层,后面的单总线CPU设计…

作者头像 李华
网站建设 2026/10/4 5:33:43

Avalonia Linux跨平台开发实战:从环境搭建到生产分发

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/10/4 5:32:36

ZYNQ下KSZ9031 MMD读取失败排查与解决

做ZYNQ网络核的时候,我最常被问的一句话就是:“ksz9031 mmd读取不了,到底是PHY坏了还是我写错了?” 这句话我听得耳朵起茧。KSZ9031RNX这颗PHY在ZYNQ板卡上实在太常见了,配合LwIP做千兆以太网,几乎人手一块…

作者头像 李华
网站建设 2026/10/4 5:32:07

开题别再“一个对话框硬扛”:临床中药党写用药安全研究,可以这样搭 AI 工具 [特殊字符]

先把场景说具体:我是临床中药学专业,这次要完成的不是普通课程小论文,而是毕业论文的开题报告。题目暂定为:活血化瘀类中药注射剂与抗血小板药联用的出血风险研究——基于某院 HIS 数据的回顾性分析这个题目很有临床中药学的味道&…

作者头像 李华