
简介CAT12.7作为SPM12生态中常用的脑结构影像分析工具箱该安装包面向需要稳定复现形态学分析流程的神经影像研究者、医学研究生等入门与进阶用户。由于官方版本更新导致旧版下载入口被覆盖这份压缩包完整保留了作者笔记对应的CAT12.7版本环境可配合教程直接运行T1结构像预处理、灰质体积测量等操作。资源共822个文件以312个m脚本、109个png示意图、43个gii表面数据、31个nii影像模板为主同时包含Schaefer2018多个分辨率及HCP-MMP1脑图谱annot注释文件、适配Win/macOS/Linux平台的mex编译组件等压缩后222.93MB整体构成较完整的功能性子模块结构。目前已有1727人学习下载这一版本适合希望使用与既有笔记匹配环境、快速获取皮层分区图谱与工具函数减少自行配置老版本成本的读者。1. 神经影像不是玄学CAT12.7 安装包把 VBM 全流程做成了可复现管线拿到一百个被试的 T1 结构像要做灰质体积比较手写 VBM 流程至少两星期用 CAT12.7 这个源码软件环境配置好之后一个晚上能跑完全组数据。第一次拆包的人通常会被它几百个 .m 文件吓住读透之后你会发现它就是一条从原始 T1 到灰质体积、皮层厚度的自动化管线分割、配准、质量检查、统计接口全给你备好了。下文按我实际拆包、在服务器上跑通、再改脚本的顺序讲清楚这个安装包怎么装、怎么跑、怎么改成自己的分析流程给正准备在脑结构数据上做一次完整分析的开发者一个能直接落地的方案。2. 安装包结构拆解从源码目录看一个神经影像工具箱的设计CAT12.7 和普通源码软件最大的区别在于它的「安装」不是一个黑匣子安装程序而是把整套源码摊开在你面前。这对做影像分析的组来说特别友好任何参数你都可以顺着脚本追到它被使用的位置出了问题不用瞎猜。2.1 目录分工几百个 .m 文件不是乱摊子CAT12.7 解压后是一个 cat12 文件夹我一般直接放进 SPM12 的 toolbox 目录这样 SPM 启动时能顺着工具箱扫描逻辑自动发现它。顶层堆着大量 .m 文件命名规律很强cat_ 前缀是 CAT 主逻辑spm_ 前缀是 SPM 的扩展剩下的是内部工具。按前缀分组基本能定位任何功能。文件/目录职责说明cat_defaults.m全局默认参数GUI 与脚本共用一份配置cat_main.m分割与归一化主流程入口cat_conf_estwrite.m预处理 job 配置定义对应 GUI 的 Segment Datacat_conf_long.m纵向分析 job 配置cat_vol_*.m体数据工具集裁剪、重采样、偏置场校正cat_surf_*.m表面网格生成、皮层厚度计算cat_long_*.m个体内纵向配准与分割cat_roi / cat_atlas图谱与 ROI 统计tpl/TPM、DARTEL 模板、脑图谱xml/质量协议与报告样式internal/内部实现不建议直接调用这个表值得对着自己解压出来的包过一遍。写批处理脚本时打交道最多的是 cat_conf_estwrite.m 和 cat_conf_long.m想知道 GUI 上某个下拉框对应脚本里的哪个字段直接在这两个文件里搜界面文案最快比翻文档都准。2.2 依赖链为什么 CAT12.7 不能脱离 SPM12 单独跑CAT12.7 本质上不是一个独立软件而是一个寄生在 SPM12 里的工具箱。数据读写走 spm_vol、spm_read_vols批处理依赖 spm_jobman归一化复用 SPM 的形变场框架平滑调 spm_smooth。换句话说SPM12 提供基础设施CAT12 提供脑形态学分析的专业逻辑两者合起来才是一条完整链路。版本搭配上MATLAB 建议 R2018b 及以上版本太老会出现函数找不到之类的诡异报错SPM12 也要用较新的修订版。机器上如果有并行计算工具箱nproc 参数才能享受到多核加速否则只能单核跑全组数据的时间会拉得非常长。2.3 tpl 模板目录结果落在哪个空间由它决定tpl 目录很容易被忽略但它的地位很关键。TPM.nii 是组织概率图分割时判定体素属于灰质、白质还是脑脊液的先验就来自这里DARTEL 模板用于把个体数据归一化到公共空间保证不同被试的脑区能对上atlas 子目录里放着若干脑图谱做 ROI 统计时按图谱编号提取值。我见过有人把脚本里的模板路径指错位置一批数据全跑出空间错位的结果。血泪经验是模板路径永远用 fullfile(spm(dir), toolbox, cat12, tpl, ...) 拼出来不要手写绝对路径否则换机器、换环境就要改一遍。2.4 质量检查机制xml 报告不是事后补丁CAT12.7 在预处理阶段就内置了质量检查每次处理完会生成一份 xml 质量报告核心指标包括整体质量等级、表面质量分数这些。服务器上没图形界面也能生成网页版报告评审或存档时直接甩链接给组里其他人比一张截图清楚得多。这个设计思路值得学质量信息在产出阶段就跟着数据走而不是等统计分析完才发现某几个被试的数据是废的。3. 环境搭建与首次运行把安装包变成能出结果的流程从拆包到跑出第一份结果最长的一段路通常是环境问题。下面按我自己的顺序走一遍每一步卡住都有对应的排查点。3.1 环境准备三件事先确认装之前先确认三件事。第一MATLAB 版本在 R2018b 以上可以从 about 界面看版本号版本太老会在启动阶段报错第二SPM12 已经能正常打开 GUI这样 CAT12 的按钮才有地方挂第三确认有没有并行计算工具箱没有的话后面 nproc 只能写 1速度会差好几倍。磁盘空间也别省。单被试的完整输出包括 p 系列、mwp1、形变场、表面数据加起来 5 到 10 GB 很常见。全组一百个被试之前先算好剩余空间别跑一半磁盘写满MATLAB 会直接崩给你看。3.2 安装步骤路径正确比什么都重要% 在 MATLAB 中把 SPM12 与 CAT12.7 加入路径 spm12_path /opt/spm12; cat12_path /opt/spm12/toolbox/cat12; addpath(spm12_path); addpath(cat12_path); % 只加根目录不要用 genpath savepath;这里特意强调只 addpath(cat12_path)不要图省事写成 genpath(cat12_path)。internal 等子目录里有些通用函数名会和 SPM 自带函数重名一旦路径顺序不对启动时会报一堆 Undefined function。我在这上面翻过一次车后来规规矩矩只加根目录再没出过问题。保存路径后重启 MATLAB命令行输入 spm 打开主界面右侧会出现 CAT12 按钮点进去能看到 Segment Data、Longitudinal、Surface 等入口说明安装成功。按钮没出现先检查路径是不是真的保存进 startup.m 或 matlabrc 了。3.3 首次运行单被试先跑通再谈批量装完之后最忌讳的就是直接丢全组数据进 GUI。先用一个 T1 数据在 Segment Data 界面手工跑通观察命令行输出和产物文件这样比出错了再大海捞针地排错高效得多。首次运行结束后输出目录应该出现 p 系列、mwp1 前缀的文件以及 surf 子目录。用下面命令快速验证ls *p0* *p1* *p2* *mwp1* 2/dev/null ls surf/命令行里出现 CAT12 版本信息且没有报错单被试验证就算通过。这一步是后悔药单被试只要几分钟出问题能立刻定位直接跑批量的话几十个被试的错误混在一起翻日志都能翻到头大。3.4 输出产物解读p0、p1、p2、mwp1 分别是什么跑完后目录里多了一堆缩写文件第一次看容易懵。快速对照表产物含义p0_*原始空间的组织分割图p1_*归一化到模板空间的组织图p2_*归一化并调制后的组织图mwp1_*调制灰质图VBM 统计直接用它做平滑后比较surf/lh.thickness左半球皮层厚度cat_*.mat该被试的体积标量与质量指标调制modulation这一步很关键乘上形变场的雅可比行列式保留脑区体积信息。如果只做密度分析不关心体积可以不勾调制但经典 VBM 默认是调制的。4. 核心模块拆解从 T1 到灰质体积的关键处理链路跑通一次之后就该把黑匣子打开看看里面到底发生了什么。CAT12.7 的处理链路可以拆成三块分割、表面重建、批处理封装。4.1 分割主流程一次 estwrite 到底做了什么estwrite 是 estimate write 的缩写一次任务里同时完成参数估计和结果写出。大致顺序是读入 T1做偏置场校正和强度归一化消除扫描仪场不均匀性仿射配准到参考空间让数据大致摆到一个公共位置基于 TPM 先验和图像强度做混合模型分类估计每个体素属于灰质、白质、脑脊液的概率用 DARTEL 做非线性配准把个体形变场估计出来按设定输出调制或未调制的组织图。脚本里几个常用参数的含义要理解到位。nproc 是并行核数设成机器核数的一半比较稳affreg 控制仿射配准参考东亚人群数据用 eastern 比默认 mni 更不容易在深部结构上漂ngaus 是每个组织类别的高斯分量数默认值对大多数数据够用但数据噪声大的时候试着降一档分割会更平滑denoise 打开后会对图像做自适应降噪对老式扫描仪数据特别管用。4.2 表面重建与皮层厚度从体积分割到网格分割完成后如果想做皮层厚度分析需要走表面重建这一步。CAT12.7 会把灰质概率图转换成左右半球的网格表面再沿着表面法线方向计算皮层厚度。这个投影算法在 cat_surf_*.m 里实现不需要你手动设置复杂的平滑参数。表面输出是一组 gifti 格式文件常见的是 lh.thickness、rh.thickness 以及 central、area 这些网格数据。皮层厚度不是标量图而是每个网格顶点一个值所以后续做统计时不能直接套用体积分析的 SPM 流程一般要先做表面平滑再做顶点水平的组间比较。这一步很多人会忽略结果就是用错了模态。4.3 批量处理脚本实战一个循环跑完整组被试GUI 能用的功能批处理脚本里都有对应字段。我一般先在 GUI 里配好一次点 Save Batch 生成脚本再把被试循环套进去。下面是一个完整的全组 VBM 批处理脚本% CAT12.7 全组 VBM 批量脚本 clear; clc; spm(defaults, fmri); spm_jobman(initcfg); % 被试列表按你的目录结构改 subjects {sub-01, sub-02, sub-03}; base /data; for i 1:numel(subjects) t1 fullfile(base, subjects{i}, anat, [subjects{i} _T1w.nii]); if ~exist(t1, file) warning(缺失 %s跳过, t1); continue; end matlabbatch{1}.spm.tools.cat.estwrite.data {t1}; matlabbatch{1}.spm.tools.cat.estwrite.nproc 4; matlabbatch{1}.spm.tools.cat.estwrite.opts.tpm {... fullfile(spm(dir), toolbox, cat12, tpl, TPM.nii)}; matlabbatch{1}.spm.tools.cat.estwrite.opts.affreg eastern; matlabbatch{1}.spm.tools.cat.estwrite.opts.ngaus 2; matlabbatch{1}.spm.tools.cat.estwrite.opts.denoise 1; matlabbatch{1}.spm.tools.cat.estwrite.output.GM.native 1; matlabbatch{1}.spm.tools.cat.estwrite.output.GM.mod 1; matlabbatch{1}.spm.tools.cat.estwrite.output.surface 1; try spm_jobman(run, matlabbatch); catch err fprintf(【失败】%s: %s\n, subjects{i}, err.message); end enddata 字段必须用 cell 包装漏掉花括号的话 spm_jobman 会直接报错nproc 按机器核数的一半设16 核机器写 8 没问题8 核机器写 2 到 4 比较稳opts.tpm 指向 tpl 目录里的 TPM.nii不要写死绝对路径。try/catch 包裹循环的好处是单个被试失败不会中断整组任务日志里能留下失败原因。提示CAT12 不同小版本的 batch 字段名偶有调整。最可靠的做法是先在 GUI 里配好参数点 Save Batch生成的脚本字段一定和你手头的版本匹配再往自己的循环里套。跑完之后每个被试目录会生成 cat_*.mat 文件里面存着 TIV、灰质总体积、白质总体积这些标量。抽全组指标的小循环% 汇总全组体积指标 subjects {sub-01, sub-02, sub-03}; for i 1:numel(subjects) m dir(fullfile(base, subjects{i}, cat_*.mat)); if isempty(m), continue; end S load(fullfile(m.folder, m.name)); % 字段名可能随版本变化先 fieldnames(S) 确认一下 fprintf(%s TIV%.2f\n, subjects{i}, S.TIV); end字段名我吃过一次亏当时直接按别人博客里写的字段取结果全是空值。后来统一先 fieldnames 看一遍再取一分钟的事能省半天排查。5. 避坑指南从装不上到算不对的五个典型问题这部分是我和几个做过同一批数据的同学踩坑总结每条都按现象、原因、解决三段写遇到同症状直接照着处理。5.1 路径与版本类问题坑一启动 CAT12 报 Undefined function 或按钮不出现现象MATLAB 命令行输入 spm 能打开主界面但右侧没有 CAT12 按钮直接调 cat_main 报 Undefined function。原因SPM12 和 CAT12 的路径加载顺序反了或者 genpath 把 internal 子目录加进了路径导致同名函数互相覆盖。解决先 addpath SPM12 根目录再 addpath cat12 根目录只加根目录重启 MATLAB。如果还不行用 pathtool 检查重复路径把旧的 cat12 路径删干净。坑二输出目录里没有 surf 文件夹现象分割和归一化结果都正常但 surf 目录不存在厚度数据无从谈起。原因estwrite 界面的 surface 输出选项没勾选默认配置不生成表面。解决在 batch 里确认 output.surface 1或者在 GUI 里把 Surface and thickness 勾上后再保存脚本。检查字段时对着自己的 GUI 版本看不同小版本字段名略有不同。坑三脚本写好了但 spm_jobman 不认现象自己手写的 matlabbatch 结构spm_jobman(run, matlabbatch) 直接报 config 错误。原因手写字段名和当前版本的配置定义不一致最常见的是把 nproc 和 opts 写到了错误的结构层级。解决先进 GUI 点一遍 Segment Data设置完参数后 Save Batch拿生成的脚本对照自己的结构只改 data 和被试循环其他原样保留。5.2 数据与计算资源问题坑四内存不足MATLAB 直接崩现象跑第一个被试时系统内存耗尽MATLAB 进程被杀命令行窗口直接消失。原因nproc 设成了机器核数每个核同时加载模板和图像数组16G 内存的机器根本扛不住 8 个核的体数据运算。解决nproc 设成核数的一半服务器上跑之前用 free -g 看实际可用内存单被试验证时先用 nproc1确认数据没问题再并行。坑五一部分被试结果里厚度图是花斑质量报告显示 D 级现象分割表面出来了但厚度图视觉上噪声很大xml 报告里质量等级落在 D形态学明显不可信。原因头动伪影或脑组织外残留严重分割阶段把非脑组织当成了灰质表面重建把噪声投影成了厚度峰值。解决回到原始 T1 检查是不是有伪影试着把 denoise 打开再跑一次还不行就手工调整偏置场强度参数重跑。如果三种办法都救不回来直接标记该被试为质量不合格别硬塞进组间统计否则分析结果会被几个离群点带偏。6. 二次开发思路把 CAT12.7 嵌进你自己的分析流水线跑通全组数据只是起点真正能让效率翻倍的是把这套处理嵌进你自己的项目里让数据从进目录到出报表中间不需要人守在旁边。6.1 从 GUI 参数到可复用脚本我现在的组织方式是每个项目一个总脚本被试列表、T1 路径、输出目录全部由总脚本生成CAT12 的 batch 只负责最核心的处理逻辑。路径不再手写而是从项目配置里读。这样换电脑、换服务器只改一处配置文件整个流水线照跑。6.2 把质量指标和体积数据汇总成一张表前面提到的 cat_*.mat 和 xml 报告可以统一抽出来合成 CSV。我一般会在批量跑完后自动跑一个收集循环把每个被试的 TIV、组织体积、质量等级写进一张表然后在统计阶段直接按这张表排除不合格被试。这一步以前都是人工翻报告后来做成脚本半天的工作变成三分钟。6.3 与统计模块衔接VBM 的 mwp1 图在平滑之后可以直接进 SPM 的 second-level 做组间比较皮层厚度则是走 gifti 表面统计。要做的就是把预处理输出和统计模块的输入目录对齐别让两个阶段的数据组织方式打架。那次全组跑完发现一半数据没有 surf 输出以后我每次拿到新安装包都会先单被试验证、再全组批量这个流程帮我挡住了不少翻车。希望帮到你。本文还有配套的精品资源点击获取