简介:CAT12.7是脑影像领域常用的SPM扩展工具箱,主要面向神经影像科研人员、临床研究生及有MATLAB基础的初学者,用于结构像数据的分割、VBM分析、皮层厚度与表面形态学测量。作者围绕该版本整理了系列学习笔记,因官方更新导致旧版安装包难以从官网获取,故上传这一稳定可用版本,方便读者按笔记逐步搭建一致的分析环境。资源包共822个文件,压缩后约222.93MB,属于典型的源码软件包:既包含312个m函数脚本、26个exe辅助工具,也带有31个nii影像样例、43个gii皮层表面数据,以及Schaefer2018、HCP-MMP1等FreeSurfer annot注释文件,能够覆盖从预处理、分割到图谱可视化的完整流程;压缩包还收录了多平台预编译的mex二进制文件,便于在Mac、Linux和Windows上直接运行。目前已有1727人浏览学习,适合希望复现作者T1处理流程、系统掌握CAT12操作的中高级研究者和初学者。
1. CAT12.7 版本安装包:脑结构分析前的第一道坎
做结构 MRI 预处理的人多半都经历过这个场景:数据已经脱敏整理好,分析计划也写完了,结果栽在第一步——CAT12 装不上。某课题组里 A同学 第一次跑皮层厚度测量,拿着师兄给的压缩包直接解压到 SPM 的 toolbox 目录,启动时报错,查了半天才发现是 MATLAB 版本问题。CAT12.7 这个安装包本身并不复杂,本质上是 SPM12 框架下的一个计算解剖学工具盒,装好了就能做脑组织分割、皮层厚度估算和体积测量。这篇文章适合那些正要上手结构影像分析、被版本匹配和路径配置绕晕的人,也适合打算在批处理流程里集成 CAT12 的老手——安装只是开始,真正麻烦的是环境匹配和跑批时的各类隐性问题。
2. 环境准备:MATLAB 版本与 SPM 前置条件
2.1 为什么 CAT12.7 必须挂在 SPM12 下面
CAT12 不是一个独立运行的软件,它是作为 SPM12 的工具箱存在的。它复用 SPM 的图像读取、显示、空间配准和分割框架,自己只负责实现组织概率模板、皮层表面重建和厚度计算这些专用逻辑。如果机器上装的是 SPM8 或更老版本,CAT12 在启动阶段就会因为找不到对应 API 而静默退出,或者在跑分割时报出一串看不懂的字段错误。
所以在动手之前,先确认你手上的 SPM 版本。检查方法是在 MATLAB 命令窗口输入:
which spm which spm12如果which spm返回的是空值,说明 SPM 还没加入 MATLAB 路径;如果返回路径里带spm8,那就要先升级到 SPM12。我一般建议直接去 SPM 官方仓库拿最新的 SPM12 稳定版本,不要再纠结旧版兼容,CAT12.7 在设计时就是按 SPM12 的接口写的,用旧框架纯属给自己挖坑。
参数说明:which是 MATLAB 的内置函数,用来定位某个函数或脚本的完整路径。它比exist更直观,因为能直接看到实际命中的文件路径。如果同时装了多个版本的 SPM,which spm会显示当前 MATLAB 路径里排在最前面的那个,你可以据此判断优先级是否混乱。
2.2 MATLAB 版本区间:不是越新越好,但也不能太旧
CAT12.7 安装包对 MATLAB 版本有隐含要求,这一点安装说明里往往一笔带过。实际踩坑下来,R2019b 到 R2023b 这个区间是稳妥的,太老的版本比如 R2016a 在运行表面重建模块时会出现内存分配异常,太新的版本在部分 Linux 发行版上可能和系统 glibc 库存在编译兼容问题。
检查 MATLAB 版本,在命令窗口输入:
version如果版本在 R2019b 以下,建议先升级 MATLAB;如果你的课题组只有旧版本授权,也可以尝试用 Octave 跑 SPM12,但 CAT12.7 的图形界面部分对 Octave 的兼容性不理想,批处理模式能跑,交互式操作会卡。所以我的建议是:做 CAT12.7 分析就用 MATLAB,别在 Octave 上省这笔时间。
版本选择之外还有一件事:确认 MATLAB 是 64 位。CAT12 的 MEX 编译文件全部按 64 位架构编的,32 位 MATLAB 连加载都过不去。这个检查通常在安装 MATLAB 时就确定了,但如果你用的实验室共享服务器上有多套 MATLAB,就要注意别点错启动脚本。
2.3 磁盘空间与内存:预处理耗的是中间文件
很多人以为 CAT12 只是个分析工具,装完本体几百兆就够。实际上跑一次完整的 T1 预处理,中间产物会占用相当可观的磁盘空间。原始图像、偏置校正后的图像、分割得到的灰质和白质概率图、皮层表面网格、厚度映射图,林林总总算下来,单例数据通常会膨胀到原体积的 5 倍以上。
所以在安装前先确认磁盘余量:
df -h至少保证数据分区有 20 GB 以上的空闲空间,这个数字不是空穴来风——如果你跑的是纵向队列研究,一例受试者可能包含多个时间点的 T1 像,中间文件会成倍增长。另外内存不要低于 8 GB,推荐 16 GB。分割步骤对内存的消耗很大,32 位系统上最大只能用到约 3 GB 内存,这就是另一个必须用 64 位系统的原因。
提示:预处理中间文件默认写在数据所在目录下一个名为
cat12_*或mri的子目录里,跑完分析后可以手动清理,但要保留xml报告文件和最终的厚度图。
3. 安装落地:路径注册、启动方式与批处理入口
3.1 解压安装:不是扔进 toolbox 就完事
拿到 CAT12.7 安装包后,先解压。Windows 上用解压工具直接解压到SPM12/toolbox目录下,Linux 服务器上我用命令行习惯是:
cd /path/to/spm12/toolbox tar -xzvf cat12_7.0.tar.gz mv cat12_7.0 cat12移动目录改成cat12是为了后面路径书写方便,避免版本号在批处理脚本里来回替换。解压完成后检查目录结构,确认里面有cat12.m、CAT12.m、templates、xml这些关键文件。如果发现压缩包里的目录结构不完整,多半是下载过程中文件损坏,重新下载一次即可。
注意:不要在压缩包解压中途直接运行 MATLAB,部分文件会在读取时被占用导致解压中断。先解压完,再启动 MATLAB 配置路径。
3.2 路径注册:setpath 才是持久化
MATLAB 里临时加路径可以用addpath,但这条命令只在当前会话有效,重启 MATLAB 后路径全部丢失。正确做法是在 MATLAB 界面里点Set Path,或者用命令方式:
addpath('/path/to/spm12'); addpath('/path/to/spm12/toolbox/cat12'); savepath;savepath会把当前路径保存到 MATLAB 的 startup 配置文件里,下次启动自动加载。如果savepath返回警告,提示没有写入权限,说明 MATLAB 安装在系统受保护目录,这时需要以管理员权限运行 MATLAB,或者把路径保存到用户目录的matlabrc文件中。
另外注意路径中不要出现中文或空格,这在 Windows 上特别容易踩坑。有的课题组把数据放在D:\脑影像数据\这种目录下,MATLAB 对中文字符的支持并不稳定,建议把 SPM12 和 CAT12 都放在纯英文路径下。
3.3 图形界面启动:cat12 命令的两种形态
路径配置好后,在 MATLAB 命令窗口输入:
cat12这是最简单的启动方式,CAT12 会弹出主界面,包含数据选择、处理模块参数设置和运行按钮。图形界面适合单例数据处理或参数调试,但不适合批量跑队列数据。
另一种启动方式是直接调用 SPM 的批处理框架,跳过 GUI。核心命令是:
spm_jobman('initcfg'); matlabbatch{1}.spm.tools.cat.estwrite.data = {'/data/subj01/T1.nii'}; matlabbatch{1}.spm.tools.cat.estwrite.opts.tpm = {'/path/to/spm12/toolbox/cat12/templates/Template_TPM.nii'}; spm_jobman('run', matlabbatch);spm_jobman('initcfg')的作用是初始化 SPM 的作业管理器配置文件,跳过这一步直接run会报错Reference to non-existent field 'tools'。matlabbatch是 SPM 批处理的核心数据结构,它是一个 cell 数组,每个元素对应一个作业模块。这里配置的是cat.estwrite,即同时执行估计和写出两步,适合已完成配准的标准空间 T1 图像。
3.4 批处理批量跑:循环脚本与并行
实际项目中很少只处理一例数据。批量跑的时候,我一般用小脚本循环构造matlabbatch:
subject_list = {'subj01','subj02','subj03'}; spm_jobman('initcfg'); for i = 1:length(subject_list) matlabbatch{1}.spm.tools.cat.estwrite.data = {[root_dir subject_list{i} '/T1.nii']}; matlabbatch{1}.spm.tools.cat.estwrite.opts.tpm = {cat_tpm}; spm_jobman('run', matlabbatch); end参数说明:root_dir是数据根目录,subject_list是受试者 ID 列表。每次循环都会覆盖matlabbatch{1}的数据字段,然后调用spm_jobman('run')执行。这样做的好处是单例出错只会中断当前循环,且可以通过try-catch把错误日志记录下来:
for i = 1:length(subject_list) try spm_jobman('run', matlabbatch); catch err fprintf('Error in %s: %s\n', subject_list{i}, err.message); end end这里try-catch用了 MATLAB 标准的异常处理结构,err.message只提取错误文字信息,不打印堆栈,日志更干净。跑完后再单独排查失败的那几例。
4. 常见问题排查:四个翻车现场与定位方法
4.1 启动就报“Invalid MEX-file”
现象:输入cat12后 MATLAB 报错,提示找不到或无法加载某个.mexa64文件。
原因:CAT12 的 MEX 文件是针对特定 MATLAB 版本编译的,不同版本之间的 MEX 接口不兼容。另一个常见原因是 Linux 系统缺少对应的 glibc 库,老版本 CentOS 上编译的 MEX 在新系统上运行会遇到符号解析失败。
解决:先用file命令查看 MEX 文件的位数和依赖:
file /path/to/spm12/toolbox/cat12/mex/*.mexa64如果输出显示 32-bit 但同时装了 64 位 MATLAB,那就是文件放错版本;如果显示 64-bit 但仍有加载失败,尝试用ldd检查动态库依赖:
ldd /path/to/spm12/toolbox/cat12/mex/cat_vol_surface.mexa64输出中如果出现not found标记,说明缺系统库。此时不要硬刚,直接在 MATLAB 里重编译对应源文件即可,源文件通常在cat12/mex目录下有.c后缀的原始代码。在 MATLAB 里执行:
cd /path/to/spm12/toolbox/cat12/mex mex cat_vol_surface.c重编译后替换原 MEX 文件,启动问题基本解决。
4.2 路径每次重启都失效
现象:配置好路径后,当天能正常启动 CAT12,第二天重启 MATLAB 又提示找不到cat12函数。
原因:savepath没有生效,或者 MATLAB 启动文件被覆盖。常见场景是管理员在服务器上用了restoredefaultpath清理路径,把用户自定义路径全清掉了。
解决:不要依赖savepath一次性写入,更稳妥的方式是在startup.m里每次启动时自动加载路径。在 MATLAB 用户目录下创建文件:
% startup.m addpath('/path/to/spm12'); addpath('/path/to/spm12/toolbox/cat12');startup.m是 MATLAB 启动时的自动执行脚本,里面可以写多行addpath命令。每次 MATLAB 启动都会执行一次,保证路径不被系统路径清理影响。注意startup.m文件名为小写,且必须放在 MATLAB 的用户路径目录下,可以通过userpath命令查看当前用户路径的位置。
4.3 预处理跑到一半内存不足
现象:分割或表面重建阶段 MATLAB 卡死,然后报错Out of memory。
原因:CAT12 的表面重建算法对内存的占用曲线不是线性的,在某些高分辨率 T1 图像上会瞬间申请大量内存。尤其是同时打开图形界面和后处理显示时,内存消耗翻倍。
解决:分两步走。第一步调整 MATLAB 的 Java 堆内存,在 MATLAB 界面的偏好设置里增大堆内存到 2 GB 或更高;第二步是跑批处理时不打开 MATLAB 桌面,用命令行模式启动:
matlab -nodesktop -nosplash -r "spm_jobman('initcfg'); cat_batch_script; exit"-nodesktop参数不启动 MATLAB 桌面环境,-nosplash跳过启动画面,这样可以省下约 1 GB 内存。注意-r后面的命令要用英文双引号包起来,但 MATLAB 内部的字符串用单引号,两者嵌套别写反,否则命令解析会出问题。
4.4 分割结果“飘”了:灰质概率图异常
现象:预处理流程跑完,检查xml报告发现灰质体积明显异常,或者查看分割后的p1图像,发现灰质概率图大面积数值接近 1 或 0。
原因:最常见的原因是输入 T1 图像本身的信噪比过低,或者图像方向信息(NIfTI header)错误。CAT12 做分割时依赖图像的初始配准参数,如果 NIfTI 的 qform/sform 矩阵错误,组织概率模板对齐就会失败。
解决:处理前先用 SPM 的显示模块检查图像方向:
spm_check_registration('/path/to/T1.nii');从三视图确认大脑的左右方向是否正常,以及是否有旋转偏差。如果方向不对,用 SPM 的spm_orient或专业工具重新设置方向后,再跑 CAT12。另外一个容易被忽略的坑是:输入的 T1 图像不要是压缩格式的.nii.gz,CAT12 的某些模块对压缩 NIfTI 的处理不是全兼容,统一先解压成.nii再运行。
注意:如果数据是 DICOM 格式,不要直接用 DICOM 文件跑 CAT12,先通过 SPM 的
spm_dicom_convert转成 NIfTI。这一步不只是格式转换,还会自动重新计算图像的方向矩阵,能规避很大一部分分割问题。
5. 装完之后这一招:用一张标准 T1 验证整条流水线
安装完成后不要急着把真实数据全量提交,花十分钟跑一张验证图像,能免掉后续一整天的排查时间。我习惯用一份从公开数据集中截取的 T1 加权像做冒烟测试,这张图像最好包含完整的脑组织覆盖和清晰的白质灰质边界。
验证流程如下:
- 复制一张测试 T1 到独立目录,避免污染真实数据。
- 启动 MATLAB,进入 CAT12 图形界面,选择
Segment模块。 - 保持默认参数不修改,直接运行。
- 检查三个关键产物是否生成:
mri/p1*.nii(灰质概率图)、surf目录下的左右半球网格文件、report目录下的xml质量报告。
质量报告的读取可以自动完成:
xmlfile = spm_select('FPList', 'report', '^cat_.*\.xml$'); [~, q] = cat_io_xmlread(xmlfile); disp(q.qualityratings);这段代码通过spm_select定位报告目录下的 xml 文件,cat_io_xmlread解析出质量评分。qualityratings字段里包含了信噪比、图像均匀度、分割精度等多项指标。如果拿到的是IQR(内部质量等级)分级在 A 或 B,说明安装和参数配置没有问题。质量等级是 C 或 D,就要回头检查预处理参数或起始图像质量。
验证跑通后,把真实的批处理脚本挂上,但前两例仍然不要批量运行,单例跑完后直接看p1图像和皮层厚度图,确认解剖结构正常再放开全量。从那以后我每次装完 CAT12.7,都强制走一遍这个冒烟测试流程,不做完整验证就开始批量跑数据的代价,是可能一次性产生几十例错误分割的中间文件,清理起来远比重新跑一遍麻烦。希望这篇实战笔记能帮你少踩几个坑,装好了就把精力留给真正的分析问题。
本文还有配套的精品资源,点击获取