ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

FreeSurfer+3D Slicer在颅内电极定位与脑区分割中的完整实战流程

FreeSurfer+3D Slicer在颅内电极定位与脑区分割中的完整实战流程 做脑科学或者功能神经外科相关工作的朋友一定绕不开一个问题怎么把大脑划分成有解剖意义的区域再把颅内电极的触点精确对应到这些区域上。这个需求在癫痫灶定位、认知功能研究、DBS靶点分析里几乎天天出现。我前前后后跑这套流程跑了快三年试过不少组合方案最后稳定下来最顺手的组合就是FreeSurfer加3D Slicer一个负责脑区分割和表面重建一个负责医学影像配准、电极可视化和坐标提取全部免费可复现性高而且每一步都有办法做人工核验。这篇就完整梳理一下从原始T1到电极坐标落到脑区上的全过程让刚开始接触的人少走点弯路。这套流程看起来不复杂真正做起来细节很多。比如FreeSurfer的recon-all跑一次要多久、跑到一半卡住了怎么断点续跑3D Slicer里配准怎么调参数才能避免电极限位偏移坐标提取之后怎么核验对不对这些问题网上零零散散有答案但很少有把它串成一个完整工作流的。本文就把我实测过的方案、命令、参数以及踩过的坑全部放出来。1. 整体流程设计为什么固定用FreeSurfer加3D Slicer1.1 核心需求拆解先明确一下这个项目的目标。临床上和科研中最常见的场景是患者术前拍了高分辨率T1加权MRI然后做了颅内电极植入手术术后拍了CT用来确认电极位置。我们要做的核心事情有两件把大脑的解剖结构做自动分割得到皮层的沟回标签、皮层下核团标签甚至海马亚区、丘脑核团这类精细结构。把术后CT里的电极触点坐标映射到术前MRI对应的脑区位置上算出每个触点落在哪个脑回、哪个核团输出一组可复现的坐标数据。这两件事正好对应了FreeSurfer和3D Slicer的核心能力FreeSurfer的长处是自动化的皮层重建和脑区分割3D Slicer的长处是影像配准、三维可视化以及手工标注。两者配合恰好覆盖了整个流程中最难啃的两块骨头。1.2 工具对比为什么不选其他方案脑区分割这个环节市面上不是没有其他工具。CAT12、ANTs、HCP Pipeline都能做皮层分割各有各的特点。但FreeSurfer在电极定位这个场景下有一个别人比不了的优势它输出的不仅仅是体积标签voxel-wise label还有独立的皮层表面模型pial和white surface这个表面模型在三维可视化里非常直观配合电极触点做投影分析很方便。电极定位这个环节也有一体化软件比如LEAD、Brainstorm、iELVis但它们要么对数据格式有额外要求要么依赖特定的环境配置要么不太容易做批处理。3D Slicer则是一个很灵活的通用平台配准用General Registration模块标记点用Markups模块计算变换矩阵用Transforms模块所有操作都有图形界面也有Python接口可以批处理兼容性最省心。实操建议如果你的研究/临床场景只需要看单例患者的电极位置FreeSurfer 3D Slicer的组合最容易上手如果你需要做几十上百例的组分析再考虑用LEAD这类专门化的工具但学习曲线更陡。1.3 全流程的整体工作流我固定下来的工作流分成三段FreeSurfer处理术前T1完成头颅剥除、组织分割、皮层表面重建、脑区分割输出aparcaseg.mgz等标签文件。在3D Slicer中导入术前T1和FreeSurfer分割结果再导入术后CT使用刚体配准把CT对齐到T1空间。在配准后的CT上逐层标记电极触点导出每个触点的坐标然后和FreeSurfer的标签数据做空间叠加得到每个触点对应的脑区。注意第二步里我强调要用刚体配准不要用非线性配准如BSpline或SyN。原因很简单刚体配准只做平移和旋转不改变脑组织的整体几何形态术后CT和术前MRI的颅骨、脑组织在空间尺度上是一致的非线性配准做的是形变配准能把患者的脑扭曲到标准空间但同时也把电极触点的相对位置关系改变了这样一来坐标就失真了后续映射到脑区的结果也就不准了。2. 环境准备与安装跑通这一步后面都是顺水推舟2.1 FreeSurfer安装详解FreeSurfer官方支持Linux和macOS生产环境建议在Linux服务器上跑因为recon-all对CPU和内存消耗比较大台式机跑一次也要数小时。Windows系统上直接用原生版本没那么方便我实测下来最简单的方式是装WSL2Windows Subsystem for Linux在WSL里跑Linux版本GPU运算基本用不上纯粹吃CPU和内存WSL2的性能损失可以接受。安装步骤其实不复杂但有几个细节很容易踩坑。正常的流程是从FreeSurfer官网下载对应系统的安装包最稳定的是当前release版本。如果要复现以前的分析建议在服务器上归档一份当时使用的安装包FreeSurfer版本更新很快不同版本的分割结果会有细微差异组内合作时尽量统一版本。解压安装包推荐放到/opt或/usr/local目录下。设置环境变量我常用的配置写在.bashrc里。export FREESURFER_HOME/usr/local/freesurfer export SUBJECTS_DIR/data/FS_SUBJECTS export PATH$FREESURFER_HOME/bin:$PATH source $FREESURFER_HOME/SetUpFreeSurfer.sh注意SUBJECTS_DIR这个环境变量非常关键它指定FreeSurfer输出数据的存放目录。这个目录建议用读写速度快的磁盘因为recon-all会生成大量中间文件整个subject文件夹占用空间通常是几个GB。license文件是另一个高频坑。FreeSurfer需要license才能运行但这个license是免费注册的。去官网填一下姓名、单位和邮箱会得到一个license.txt文件。把文件放到$FREESURFER_HOME/目录下就行。常见报错是“License does not match any flexible...”或者直接提示缺少license多数是因为license.txt放的位置不对或者环境变量没生效。2.2 3D Slicer安装与版本选择3D Slicer是个跨平台的医学影像分析软件Windows、Linux、macOS都有对应的安装包直接下载安装包解压即用不需要额外依赖。我建议下载release版本不要追最新的开发版因为电极标记、配准这些核心模块在稳定版本里经过更多验证遇到问题的概率低。如果你想下载过往版本Slicer的下载页面提供了一个“Previous Releases”入口点进去能看到历史版本号列表每个版本都有对应的安装包下载链接。我实测下来的经验是如果你要配合某个旧教程或旧扩展模块复现操作尽量选择教程对应的版本否则菜单布局差异可能会让你对不上号。配准和Markups这两个模块都在Slicer的扩展模块管理器中一般release版本自带了绝大多数核心模块不需要额外安装扩展。真正可能需要手动安装的是某些第三方扩展比如专门做电极分析的ElectrodeLabeling扩展但基础流程用不到。2.3 硬件需求与运行时长评估很多人会低估FreeSurfer对资源的需求。recon-all完整跑一次包含autorecon1、autorecon2、autorecon3三个阶段8核16线程的CPU配置下大概需要6~10个小时T1分辨率越高越慢。内存方面建议至少16GB32GB更稳因为处理到autorecon2时会有不少中间数据加载到内存。3D Slicer的负载主要是在三维渲染上显卡有2GB以上显存就够用了。真正的瓶颈是患者在三维视图里旋转时卡不卡这个跟患者数据量有关CT层数多、体积渲染开起来之后集成显卡会很吃力但医学工作站一般的独立显卡都没问题。注意如果你的FreeSurfer机器和3D Slicer机器不是同一台处理完FreeSurfer之后把subject文件夹里需要的文件拷贝到Slicer所在机器上。最小的必要文件其实只有T1原始图像和aparcaseg.mgz两者配套使用就可以在Slicer里复原完整的脑区分割结果不必整个subject目录都拷走。3. FreeSurfer脑区分割全流程实操3.1 recon-all命令一条命令完成全部分割FreeSurfer最核心的命令是recon-all。它做的事情非常复杂简单理解就是把T1加权像经过一系列自动处理输出大脑的几何模型和脑区分割标签。最基础的调用方式是recon-all -s subject01 -i /path/to/T1.nii.gz -all其中-s指定subject的名字-i指定输入的T1图像。运行之后FreeSurfer会在$SUBJECTS_DIR/subject01/下生成所有输出。如果机器是多核的可以加上并行参数recon-all -s subject01 -i /path/to/T1.nii.gz -all -parallel -openmp 8-parallel和-openmp配合使用可以显著缩短运行时间。我们实验室8核机器上实测从9小时缩短到6小时左右。不过要注意不是所有阶段都能并行加速并行参数主要对部分模块有效但能省一点时间就省一点。recon-all内部有三个阶段autorecon1做头骨剥离、信号强度归一化、Talairach变换估计autorecon2做灰白质分割、表面重建、拓扑校正autorecon3做皮层标签化、脑区划分。用-all就能一口气跑完。如果在某一步中断了也可以断点续跑比如只跑-autorecon2-wm或者-autorecon3。3.2 检查输出结果别急着往下走跑完recon-all以后一定要做视觉质量检查这一步不能省。我去过好几个组交流最常见的做法是只盯着终端的日志看有没有报错结果分割结果里明显有脑组织缺损也不知道。关键输出文件包括文件作用mri/brainmask.mgz去除颅骨、头皮之后的脑组织mask是后续分割的基础mri/aseg.mgz体积标签图包含皮层下结构尾状核、壳核、丘脑、海马等mri/aparcaseg.mgz皮层脑回标签 皮层下核团标签的合并文件电极定位主要用它surf/lh.pial, surf/rh.pial左右半球的软膜表面模型用于三维显示和投影mri/T1.mgz预处理后的T1图像已经对齐到FreeSurfer内部空间快速检查方式是在FreeSurfer里用freeview打开freeview -v $SUBJECTS_DIR/subject01/mri/T1.mgz \ $SUBJECTS_DIR/subject01/mri/aparcaseg.mgz:colormaplutfreeview会同时显示三维脑回标签和二维切片看到明显的分割错误就要停下来修复。最常见的错误是brainmask过度腐蚀把部分颞叶或额极切掉了这种情况如果硬往下跑电极映射的精度会受影响。3.3 精细分割扩展海马亚区和丘脑核团有些研究需要更精细的结构比如海马亚区分割CA1、CA3、齿状回等或者丘脑核团分割腹外侧核、中央中核等这种情况下可以在recon-all基础上再跑recon-all -s subject01 -hippocampal-subfields-T1 -thalamic-nuclei这两个步骤会额外生成mri/lh.hippoAmygLabels-T1.v21.mgz和mri/ThalamicNuclei.v12.T1.mgz这样的文件。跑之前确认用的是比较新的FreeSurfer版本不同版本对亚区分割的标签网格和算法差异较大跨版本比较亚区体积时很容易踩坑。3.4 脑区映射坐标空间的说明在第3.2节里提到的aparcaseg.mgz是电极定位的核心参考图。它把每个体素都赋予一个整数值标签每个数值对应一个脑区。这个标签图是在FreeSurfer处理后的T1空间里而这个空间本质上还是患者自身的解剖空间只是做了方向标准化和Talairach位置估计没有改变个体脑的原始几何。理解这一点很重要电极触点坐标最终是在3D Slicer里、在患者T1空间下提取的FreeSurfer的分割标签也在这个空间里所以两者可以直接做逐体素对应。我见过有人绕弯路去把坐标转换到Talairach/MNI空间再做对应其实完全没必要还会引入不必要的插值误差。4. 3D Slicer电极定位与坐标提取实操4.1 数据导入与显示设置在3D Slicer里先把三样东西拖进界面术前T1图像、FreeSurfer的aparcaseg.mgz、术后CT图像。Slicer能直接读取mgz格式吗实测是可以的Slicer的医学图像格式插件原生支持.mgz虽然界面上不显眼直接拖入即可。导入后需要注意显示方式。aparcaseg.mgz刚加载进来可能整个图像很暗这是因为Slicer默认用线性窗位显示多标签图像但标签图的数值范围很大。解决办法是进入Volume模块把Display下拉菜单里的Lookup Table改为“GenericAnatomyColors”再开启Slice intersection里的“Crosshair”方便定位。这样脑区标签才会以彩色显示每个脑回、每个核团肉眼可辨。术后CT建议用骨窗显示窗宽约2000窗位约400因为电极触点主要在颅骨钻孔或者在脑组织内部骨窗下能看到电极点和颅骨的对比度软组织窗下反而看不清电极杆和触点边界。4.2 配准把术后CT对齐到术前T1空间配准是整个流程里误差最容易放大的步骤。我遇到的很多电极定位偏差最后追根溯源都出在配准环节。在3D Slicer中打开General Registration模块固定图像Fixed Volume选预处理后的T1MMD浮动图像Moving Volume选术后CT。配准方法选择“Rigid”把初始化方式改成“Fast and simple”或者“Centered”如果CT和T1的大致空间位置差异很大就先手动调整一下移动图像的粗略位置或者使用“Align Volumes by Centroid”初始化。这里有个参数很影响结果配准前的窗宽窗位。很多人忽略这一点。General Registration模块默认用图像的原始灰度范围做匹配如果T1和CT的灰度分布差异过大配准容易陷入局部极值。我习惯先把T1的显示窗位设置成脑组织窗窗宽约400窗位约40把CT设置成骨窗然后在Registration模块里勾选“Use intensity clipping”或者手动调节两个输入图像的灰度范围让皮质表面和颅骨内板的关键特征在灰度上更突出。这样做的好处是让算法更关注颅骨边界和脑表面这些高对比度区域而不是跟软组织里的噪声较劲。配准完成后点击“Create New Transform”或者直接应用变换把CT图像几何变换到T1空间。然后务必在三个正交切面里同时看把Transformed CT和T1做overlay显示做一个半透明叠加重点检查颅骨内板是否贴合、前颅窝底和枕骨隆突是否有错位。如果发现旋转偏移或平移错位回到Registration模块调整参数重新跑。不要试图用非线性配准来补救线性配准下对不齐说明初始顶点或图像质量有问题硬做形变配准只会让位置看起来对了实则电极坐标已经失真。检查技巧在Slicer里同时打开T1和Transformed CT把CT的Opacity调到0.5~0.7之间从三个轴向逐层翻看。重点看眼眶、视神经管区域这个部位骨性结构紧贴脑组织配准稍有偏差就会一眼看出来。若此处对齐良好其他区域的偏差一般不会太大。4.3 电极触点的标注与坐标导出配准完成后用Markups模块来标记电极触点。方法有两种一种是逐个切片手工标记一种是在三维视图中直接放置Fiducial。我强烈建议用二维切面逐层标记因为电极触点横截面在切片上呈现为高亮的亮点边界清晰比在三维视图里目测放置更准确。操作流程打开Markups模块创建新的Fiducial列表命名为“electrodes”。在Slice视图里切换到Transformed CT找到可见的第一个电极触点。点击“Place”按钮然后在触点中心单击放置一个标记点。每个触点的中心要放在高亮点最亮、范围最大的那一层上这是触点体积最大的层面。给每个标记点命名命名规则要和手术记录一致比如A1、A2、A3…B1、B2…这样可以避免后续数据整理时搞混。做完之后导出坐标在Markups模块的Fiducial列表上右键选择“Export to CSV”或者“Export to JSON”。导出文件里包含了每个标记点的坐标值是RAS坐标Right-Anterior-Superior即X轴向右、Y轴向前、Z轴向上这是医学影像里的标准神经影像学坐标体系。导出前可以检查一下如果标记点是在配准后的Transformed CT上放置的那么坐标已经自动处于T1空间不需要额外变换。这个细节要记住因为很多人以为还要乘个变换矩阵实际上Slicer里打开Transformed CT后界面坐标已经是变换后的空间坐标。4.4 电极触点与脑区的对应方法拿到电极坐标和aparcaseg.mgz标签图之后剩下的一步是把坐标对应到脑区上。最简单的办法是在Slicer里把电极标记点和标签图同时显示在三维视图中肉眼观察每个触点落在了哪个彩色区域配合Slice视图里的标签信息做确认。如果你想得到程序化、可复现的结果建议用Python脚本处理。在3D Slicer的Python console里执行或者用freesurfer的mri_info工具把坐标变换到分割图像的体素坐标然后读取该体素位置的标签值。import slicer import numpy as np # 获取电极标记点 fidList slicer.util.getNode(electrodes) ras np.array([fidList.GetNthFiducialPosition(i) for i in range(fidList.GetNumberOfFiducials())]) # 获取标签图像 labelNode slicer.util.getNode(aparcaseg) labelArray slicer.util.arrayFromVolume(labelNode) # labelArray的索引顺序是IJK且I对应X轴J对应Y轴K对应Z轴 # 把RAS坐标先转成体素坐标再查标签值 # 这一步需要用到labelNode的ras_to_ijk矩阵用脚本批量计算出标签值之后再用FreeSurfer自带查表文件FreeSurferColorLUT.txt把数字映射为脑区名称。这样就直接输出了类似“A3触点位于右侧颞中回label 121”这样的结论。5. 高频踩坑记录与排查速查表5.1 典型问题汇总这套流程跑了三年我把实际问题整理成了速查表按出现问题频率从高到低排列问题常见原因解决办法recon-all运行时提示license错误license.txt缺失或放错位置确认文件放在FREESURFER_HOME目录下用source SetUpFreeSurfer.sh后检查envFreeSurfer运行到autorecon2内存不足内存不足或swap过小加内存或设置export FS_SKIP_MCR1单次处理15分钟内存峰值最高错开并行任务分割结果中颞叶被剥除过多T1头动伪影或brainmask参数不合在freeview里用编辑工具修复brainmask重新从-autorecon2续跑3D Slicer中aparcaseg显示为黑色Lookup Table未设为GenericAnatomyColors在Volume模块的Display栏修改Lookup Table配准后CT与T1颅骨对不齐初始位置偏差过大或灰度窗位不合适先手动粗对齐再调整窗位重新配准检查是否勾选刚体而非非线性电极触点间距太密无法分辨CT层厚太厚或者触点在层间切换横断面、冠状面、矢状面结合观察必要时使用多平面重建MPR标记点坐标不在T1空间标记点放在原CT而非Transformed CT上确保当前视图显示的是Transformed CT后再标记5.2 深度排查坐标核验方法坐标核验是整个流程中最容易被忽略的环节值得展开讲一讲。第一个核验方法是体素值复核。取一枚已经标记好的触点读取它的坐标用Slicer的Probe Volume功能查看该坐标在aparcaseg图像上的标签值和最终程序化输出的标签值对比两者必须一致。如果程序输出的是右侧颞上回眼睛看到的也是右侧颞上回说明坐标变换链路没有问题。第二个核验方法是跨软件比对。如果你有过往的电极定位数据比如医院系统导出的手术计划坐标把FreeSurfer坐标和CT配准后的坐标做差看最大偏移是否超过一个体素通常为1mm级别。如果偏差超过2mm尽快回到配准和标记环节查找问题。第三个核验方法更宏观把所有电极触点同时在T1和Transformed CT上显示稍微旋转三维视图从颅骨外看向脑内确认每根电极杆的走向没有穿出硬膜外或呈异常拐折一旦出现穿出倾向大概率是标记时把伪影当成了触点或配准明显偏差了。5.3 一个经常被问到的细节区分左右脑和电极方向aparcaseg的标签值不是左右对称的左半球和右半球使用不同的数字编码。比如左侧颞上回和右侧颞上回标签不一样左半球一般是奇数右半球是偶数但也不要全凭这个规律判断最稳妥的办法是看FreeSurferColorLUT.txt里的具体名称。名字里带Left的就是左半球带Right的就是右半球。电极方向标注方面不同医院习惯不同。有的医院记录是触点编号越靠近颅骨表面越大有的则相反越靠近深层靶点越大。所以拿到手术记录后第一件事要确认触点编号从深到浅还是从浅到深的排列顺序千万别把浅表触点和深部触点弄反了。6. 复盘与扩展这套流程还能往哪里延伸FreeSurfer 3D Slicer这套流程本身已经能覆盖绝大多数电极定位需求但如果你想把它做的更深入有几个方向比较实用。第一把坐标结果直接映射到标准空间做组分析。如果你需要把多个患者的电极坐标放到一个标准脑模板上做群体统计可以在FreeSurfer里用Talairach变换或MNI152配准把个体空间的标签和坐标统一转换到标准空间。但这里要再次提醒转化前的个体空间坐标必须已经精准因为标准空间转换主要解决跨个体对齐问题修复不了个体空间的原始误差。第二结合电生理信号做脑区-行为关联。电极触点定位出来了你的研究的下一步很可能是把每个触点的神经电生理数据比如高频振荡能量、诱发电位幅度和对应的脑区标签做关联看看哪个脑区贡献了显著效应。这套流程输出的坐标是直接用脑区标签做关联的工具我就是拿它来处理了一大批SEEG数据的。第三把流程脚本化、自动化。3D Slicer的Python console可以录制宏命令FreeSurfer的recon-all本身就能批处理如果你有一批患者需要批量处理完全可以写脚本一键完成分割、配准、提取坐标整个流程减少人工操作尤其适合做科研批处理。我个人的切身体会是这套流程跑通不难真正费时间的是每一步之后的视觉复核——配准有没有偏差、分割有没有过剥、标记点有没有放偏这些环节都靠人眼把关。把复核做到位了出来的结果拿去发文章或者指导临床决策心里才踏实。最后再分享一个小技巧数据处理过程中把T1、CT、分割结果、电极CSV按患者编号归档整齐命名统一带日期三个月后回头看笔记能省下不知道多少查找的功夫。
返回列表