
直接说结论fMRI原始数据分割这件事听起来像是一个处理步骤实际上它是整个预处理流程里最容易出错、也最影响后续结果质量的一环。我见过太多人跑完一整套SPM流程最后发现分割结果一团糟灰质概率图惨不忍睹回头排查才发现是slice timing的slice order填反了或者是segment时affine regularization选错了模板。这种坑纯靠自己摸索真的很费时间所以我把这几年处理fMRI原始数据的笔记整理出来希望能帮你少走弯路。这篇笔记面向的是刚开始接触fMRI数据分析、或者已经在跑预处理但被分割环节卡住的朋友。我会把“分割”这件事拆成两个层面来讲一是时间维度上的分割slice timing时间层校正二是空间维度上的分割组织分割tissue segmentation这两个操作虽然名字都带“分割”但原理、目的、操作方式完全不同。我还会结合SPM12和FSL里最常用的做法把参数设置、操作顺序、常见报错一次性讲透。1. 先搞清楚“分割”到底指什么1.1 时间维度上的分割fMRI扫描是一层一层扫的一个TR内要采几十层图像。磁共振机器不是瞬间把整个脑壳同时拍下来的它需要按照特定顺序一层一层地采集。常见的采集方式有顺序采集sequential从第1层到第N层和隔层采集interleaved先扫奇数层再扫偶数层。这就意味着同一个TR里第1层和第30层的采集时间差了整整一个TR的几分之几而这个时间差会让BOLD信号产生相位偏移。时间层校正slice timing要做的就是选一个参考时刻把所有层面通过插值对齐到那个时间点让数据在时间上“看起来”是同时采集的。这一步处理不好后面算出来的激活体素位置会偏移时间序列的频谱也会被污染。我刚开始做的时候一直不理解为什么slice timing要放在realign前面做。后来想明白了头动校正这一步会把不同时刻采集的图像在空间上重新排列图像的强度值是通过插值重采样的。如果先做realign再做slice timing等于先对空间做了插值、再对时间做插值两次插值叠加信号失真会更明显。所以SPM官方流程默认是slice timing → realign → coregister → segment这个顺序有它的道理别随便改。1.2 空间维度上的分割空间分割指的是把大脑图像按组织类型分成灰质GM、白质WM、脑脊液CSF。这一步在SPM里对应的是Segment模块在FSL里对应的是FAST。空间分割的核心原理是基于组织概率图先验再结合图像本身的强度分布用混合高斯模型估算每个体素属于灰质、白质、脑脊液的概率。空间分割的目的通常有两个。第一个是VBM分析你要比较两组人的灰质体积差异就得先把灰质概率图提取出来做配准和统计。第二个是作为fMRI预处理的一环分割得到的白质和脑脊液概率图可以用来提取噪音信号比如aCompCor方法用于回归掉呼吸、心跳等生理噪音。所以分割的质量直接影响后续统计分析的敏感性。空间分割里有个容易忽略的细节这一步虽然叫“分割”但它不只是分灰白质它还会同时估计配准参数和偏置场bias field correction。也就是说SPM的Segment实际上是同时在做分割配准偏置场校正三件事。理解了这一点你在看分割输出文件的时候就不会困惑为什么除了c1、c2、c3分割概率图之外还有y_.nii变形场和m.nii偏置场校正后的图像。1.3 为什么原始数据阶段就要处理分割“原始数据分割”这个说法我理解有两层含义。一是字面上的直接从原始数据开始做slice timing这是预处理的第一步。二是数据处理习惯上的很多人喜欢在拿到原始数据后先做一个初步的质量检查QC看看每个通道的信号是否正常、有没有大范围的头动伪影然后再决定分割参数怎么设。不管从哪层含义理解有一点是共通的分割的参数一旦定错后面所有步骤都会被带偏。slice timing的slice order错了你可以在realign阶段发现时间序列变得很奇怪但那时你没法确定是slice timing的问题还是头动的问题。segment的affine regularization选错了DARTEL配准出来的脑形态图就会有系统性的形变偏差。所以分割这一步值得多花点时间把每个参数的含义和你的数据采集方式对齐。2. Slice Timing实操从参数计算到参数设置2.1 三组关键参数必须算清楚用SPM12做slice timing界面看起来很简单但参数填错很常见。需要你准确填定的有number of slices总层数、TR重复时间单位秒、TATR减去有效采集时间后的间隔、slice order层面采集顺序、reference slice参考层。这几个参数看起来很基础但它们每个都能毁掉你的数据。number of slices一般等于你的扫描序列参数里Slice number的值国产3T机器上常见的是32层、40层、48层。TR也很直观就是序列参数里的Repetition Time注意单位是秒不是毫秒。最容易出问题的是TASPM的帮助文档里写的是TA TR - (TR / number of slices)很多教程直接告诉你用这个公式但没说清楚这个公式的适用条件。TA的完整含义是在每一个TR内机器实际采集完所有层之后到下一个TR开始采集之前那段“空窗期”的时长。对于2D多层采集序列来说假设TR2s采了40层每层采集时间是0.05s那么实际采集时间是40×0.052sTA0。但现实是2D序列的TR通常是总采集时间的1.0到1.5倍左右也就是说会有一定的“空闲时间”TA的计算标准公式是TA TR - (TR / nslices)这个式子来源于SPM文档它假设每层采集的时间是相等的。不过我在实际处理中发现很多序列的TA并不是这么算的。最稳妥的办法是直接看扫描序列的源参数有些厂商的序列参数里会直接给出“Slab Time”或者“Acquisition Time”如果没有才退回去用公式估算。还有一个快速验证技巧做完slice timing之后把任意一个体素的时间序列画出来如果时间序列的频谱明显出现高于任务频率的锯齿状波动多半是slice timing的参数没填对。2.2 slice order怎么确认slice order这个东西是很多新手栽跟头的地方。你需要在你的扫描参数里找到层面采集的顺序顺序采集就填[1:1:nslices]隔层采集一般有两种可能先奇数层后偶数层或者从第2层开始先偶数后奇数。以32层为例如果是隔层采集、从第1层开始先奇数那么slice order填1,3,5,...,31,2,4,6,...,32。如果是隔层采集、从第2层开始先偶数那么填2,4,6,...,32,1,3,5,...,31。这些信息一般会在设备厂商的序列说明里标注英文一般叫“Interleaved (odd-first)”或“Interleaved (even-first)”。一个我踩过坑的细节有些序列是隔层采2遍multi-band/多频带采集它实际的层面采集顺序跟普通隔层不太一样slicetiming工具不一定支持需要用专门的工具。如果你用的是多频带序列建议先问问设备工程师拿到这组序列的slice acquisition group参数别硬套普通序列的规则。另外如果序列参数实在查不到可以做一个简单实验快速扫一组静息态数据用FSL的slicetimer工具跑一遍不同的--order选项对比校正后图像的时间序列平滑度也能反推出采集顺序。2.3 FSL方案和SPM方案怎么选SPM的slice timing操作图形化、直观但如果你想批量处理很多人用SPM的batch脚本会更高效。FSL的slicetimer是命令行工具命令很简单slicetimer -i 输入文件 -o 输出文件 --tcustom文件 或 --ocustom文件。FSL里需要你给定的是--repeatTR、--tcustom每层采集时间文件或者--ocustomslice order文件此外还有一个--direction参数用于指定层面的采集方向。FSL的这个--direction参数经常被人忽略它表示的是层面编号沿着哪个空间轴递增。默认是z轴自上而下但有些序列是沿着y轴采集的如果没有指定校正等于白做。SPM和FSL的选择我的建议很直接如果你后续要用SPM做DARTEL或VBM分析那就全程SPM保持处理管线统一如果你后续要用FSL的FEAT做first-level分析那就用FSL的slicetimer。混用不是不行但会引入额外的格式转换和排序烦恼。3. Segment组织分割SPM操作流程与参数详解3.1 SPM12 Segment模块的功能拆解打开SPM12点Segment按钮会弹出一个界面你只需要选入T1像严格来说应该是T1加权结构像如果是原始fMRI数据没有T1那需要先配准到结构像上。Segment的核心里面有好几个Tab最常用到的就是Data和Tissue其他选项一般保持默认。在Data这个栏里你需要指定的是Image。如果在run fMRI预处理流程时你用的是T1结构像做分割那Image就是coregister之后的T1图像。这里有个容易混淆的点分割用的图像应该是高分辨率的结构像T1而不是低分辨率的EPI功能像。EPI的功能像虽然也能分割但空间分辨率不够组织边界不清晰分割出来的概率图质量会明显偏差。Tissue栏里默认有6个组织类灰质c1、白质c2、脑脊液c3、骨骼c4、软组织c5、背景c6。如果只是做fMRI预处理需要灰白质分割前三个就够了后面的可以不管。每个组织类下面有Native Tissue、DARTEL等选项默认的Native是Saved会把灰质、白质、脑脊液的概率图各存一份c*.nii这个就够了。还有一个容易被忽略的选项是Warped Tissue配准到标准空间的概率图。如果你做VBM分析需要把灰度图配准到MNI空间那么Warped Tissue要选“Save”。如果你只是做fMRI预处理一般不需要保存warped segmentation省点硬盘空间。3.2 Bias Regularization和Affine Regularization怎么填Segment里最让人摸不着头脑的就是Bias Regularization和Affine Regularization。这两个参数直接决定偏置场校正的平滑程度和配准的初始变换。Bias Regularization全称是“偏置场正则化”它控制的是估计偏置场时的平滑约束强度。默认值Lightly regularised (0.0001)大多数情况下都够用。如果你的图像有明显的强度不均比如T1像靠近皮层的地方很亮、深部很暗可以适当调到Medium regularised (0.001)。但要注意调高正则化只会让偏置场估计更平滑对于严重的强度不均先试试SPM里另一个单独的Bias Correction工具别指望靠Segment一个模块解决。Affine Regularization这个参数选择比较重要。它控制的是分割时跟模板做仿射配准的强度SPM默认是“ICBM Space Template - European Brains”。这里有一个坑如果你处理的是亚洲人群的数据用“Average sized template”会更合适因为平均脑大小与目标人群更匹配。我见过很多人全程用默认值结果配准到MNI空间后图像里脑子的整体缩放比例不对体积统计偏差明显。我个人的经验是处理亚洲人群的数据直接把Affine Regularization改成“Average sized template”其他保持默认然后跑完分割后把c1灰质图跟T1像叠加起来看一眼如果灰质边界贴合得很好说明参数没问题如果灰质图大范围覆盖到白质区说明分割对配准的依赖太大可以尝试调整。3.3 FSL FAST命令行分割的操作要点如果你用FSL做分割对应的工具是FASTFMRIBs Automated Segmentation Tool。一条典型命令是fast -t 1 -n 3 -H 0.1 -I 4 -o output_basename T1_brain.nii.gz这里的参数含义-t 1表示输入是T1图像种类-n 3表示分成3个组织类灰质、白质、CSF-H 0.1是空间平滑度-I 4是最大迭代次数。FAST比较关键的一点是它要求输入图像必须先做脑提取skull-stripping也就是要先跑过BET或类似工具把非脑组织去掉。这一点跟SPM不一样SPM的Segment不需要先做脑提取它自己会处理。所以你用FAST时管线的顺序是BET脑提取 → FAST分割。FAST跑完之后会生成几个文件_seg.nii.gz分割标签图、_pve_0.nii.gz、_pve_1.nii.gz、_pve_2.nii.gz对应的灰质、白质、CSF概率图、*_mixparam.txt混合高斯参数等。其中pve开头的文件就是概率图对应SPM的c1、c2、c3可以用于后续的噪音回归。3.4 DARTEL与分割结果的进阶应用如果你做VBM分析分割完之后还要做DARTEL配准。DARTEL的核心思想是把每个人的灰质、白质概率图一起用来估计一个非线性变形场然后通过迭代精修得到高精度的空间配准结果。在SPM12里DARTEL流程是这样的Segment → DARTEL (create templates) → DARTEL (existing templates) → Normalise to MNI。在Segment之后你需要在Tissue的DARTEL选项里选择“Imported”这样会生成rc1*.nii和rc2*.nii也就是从原始空间重采样到DARTEL输入空间的组织概率图。接着DARTEL会逐步生成模板这个过程会花不少时间但对结果的精确度来说值得。DARTEL做完之后每人的灰质图已经被扭曲到标准空间可以用modulation选项来把体积形变考虑进去再做Smoothing最后才能做统计。整个DARTEL流程比较长但每一步都是为最终统计准确性服务的。4. 分割前的数据准备与格式转换4.1 DICOM到NIfTI带着全局操作的转换fMRI原始数据通常以DICOM格式存盘而SPM、FSL这些工具只能处理NIfTI格式所以你第一步要做的就是把DICOM转成NIfTI。推荐用dcm2niix这是目前公认最好用的转换工具它可以从一串DICOM文件里正确推断出三维体积的排列顺序自动生成4D文件如果是功能像的话并且把大部分关键采集参数写进NIfTI的头文件里方便后面读取。dcm2niix的典型命令是dcm2niix -f %p_%s -o 输出目录 输入DICOM目录-f参数控制输出文件的命名格式%p是序列名称%s是序列号。我常用的命名方式是%p_%s_%d序列名_序列号_实例号这样方便我区分同一被试的不同序列。转换后记得检查一下生成的.json文件里面会记录SliceTiming、PhaseEncodingDirection等参数这些参数跟slice timing的设置直接相关。还有一个dcm2niix的细节在转换4D功能像时默认会生成一个.nii.gz和一个.json文件。如果开了-b选项BIDS格式输出文件名会变成sub-xxx_task-xxx_run-xxx_T1w.nii.gz这种风格。如果你打算把数据整理成BIDS格式建议转的时候直接加-b参数省得后面再改。4.2 头动校正和分割的先后逻辑预处理流程里头动校正realign在slice timing之后在segment之前。这个顺序是有讲究的。slice timing需要图像层面之间的时间信息保持原始采集状态如果先做realign层面之间的时间关系会被空间插值打乱slice timing就失去了意义。所以标准逻辑是先做slice timing再做realign再做coregister把功能像配准到结构像最后做segment。realign的输出是*_unwarped.nii或经过重排的*r*.nii。跑完realign后/tmp文件夹里会生成rp*.txt文件头动参数6列这个文件在后续做运动回归时会被用到。如果你发现某个被试的头动位移超过3mm或者旋转超过3度这个被试的fMRI数据后面做统计时很可能需要排除或特殊处理分割参数也要重新检查。4.3 批处理脚本一个人处理一百个被试的经验处理大量被试时手动在SPM图形界面里一个个点效率太低了。推荐的做法是写一个MATLAB批处理脚本把slice timing、realign、coregister、segment放在一起跑。SPM12的batch模块可以记录你每一步的操作然后在MATLAB里直接运行。一个基础模板长这样matlabbatch{1}.spm.temporal.st.scans {功能像列表}; matlabbatch{1}.spm.temporal.st.nslices 40; matlabbatch{1}.spm.temporal.st.tr 2; matlabbatch{1}.spm.temporal.st.ta 2 - (2/40); matlabbatch{1}.spm.temporal.st.so [1:2:39, 2:2:40]; matlabbatch{1}.spm.temporal.st.refslice 20; matlabbatch{1}.spm.temporal.st.prefix a;这里的prefixa表示输出的文件名会加一个a前缀a开头的文件就是slice timing校正后的数据。然后realign的matlabbatch是下一段coregister再一段segment一段。整个脚本一次能处理一个被试的所有数据只要把你的路径统一管理好。批处理的时候有个经验先选两个被试手动跑一遍全流程确认每个步骤的输出文件名和期望一致再放开跑全组。不然全组100个被试跑到一半发现某个参数填错了只能全部重来。5. 常见问题与排查技巧实录5.1 一张速查表帮你定位90%的问题我把这几年遇到的分割相关报错和异常汇总成了一张表排查的时候先看这张表能省很多时间。现象可能原因处理办法slice timing后时间序列频谱有锯齿slice order填错或者TA计算不对核对扫描序列的SliceTiming参数重新计算TA分割后灰质概率图几乎全为0输入图像不是T1结构像而是功能像换用T1结构像重新检查coregister结果c1图大范围覆盖白质区Affine Regularization选错模板改成Average sized template或No regularizationSegment报错“Cannot find file”路径中包含中文或特殊字符把路径改成全英文数字去掉空格和中文分割后图像方向颠倒NIfTI方向头字段有问题用fslreorient2std或MRIcron重新设置方向DARTEL创建模板时崩溃rc1/rc2图像命名不匹配或输入图像维度过大确认rc1/rc2文件正确生成检查图像是否经过重采样调整分辨率FAST结果里白质中间出现空洞脑提取不彻底残留的脑膜/血管像素干扰重新跑BET适当下调阈值5.2 我踩过的slice timing坑有一次处理一批数据TR2秒40层TA按公式算出来是1.95秒2 - 2/40 2 - 0.05 1.95注意单位TR2snslices40TR/nslices0.05sTA1.95s结果跑完slice timing时间序列的功率谱出现了明显的规则性尖峰。我一开始以为是头动问题看rp文件最大位移0.5mm正常得很。后来仔细一查发现这个扫描序列虽然是40层但实际是multi-band因子为4的多频带采集真正的slice acquisition group不是40个独立时刻而是10个时刻内完成4层同时激发。这种情况下用普通slice timing的模型去插值自然会出现频谱污染。排查了很久最终确认问题的根源是TA的计算方式不适用多频带采集。多频带序列的slice timing本质上跟单频带不一样它的层面采集时间是“成组”的SPM默认的slice timing模型不能直接套用。解决方案是要么用设备商自带的预处理工具要么用AFNI的3dTshift做时间层校正它支持更灵活的时间参数输入要么在SPM里把每一组当作一个“层面”来处理但这样空间分辨率会受损。5.3 分割结果怎么快速检查分割完不等于万事大吉我每次都会花几分钟检查分割质量。最直接的检查方式在SPM里用Check Reg功能把分割结果c1、c2、c3叠加到原始T1图上。正常的灰质概率图应该是薄薄一圈贴在大脑皮层表面白质概率图是深部大片区域脑脊液是脑室和沟回处的信号。如果灰质概率图大面积出现在脑室外或者看起来像散落的碎片多半是偏置场校正或配准出了问题。如果灰质和白质比例严重失衡比如灰质体积占了80%以上可能是分割时把脑膜或血管分进了灰质可以尝试调高Bias Regularization或者先做颅骨剥离。另外一个批量质检技巧把每个被试的c1图体积或weighted global signal提取出来画个散点图。如果某个被试的体积异常偏离全组均值那这个被试的分割结果很可能有问题。5.4 解锁VBM分析前必须做的数据质量关卡分割完成后别急着做统计。在产出最终的灰质密度/体积图之前还有几个关卡必须过检查coregister结果EPI图像有没有和T1错位。如果功能像和结构像没对齐用EPI分割得到的组织概率图就是废的。用Check Reg把alignment显示出来旋转角度看看任何错位都要排查。检查配准到MNI之后图像是否过度形变跑完DARTEL或Normalise后看每个被试的warped图像在MNI坐标下跟标准模板是否重合。如果某个被试的脑形态变成畸形要么是分割时出了问题要么是该被试脑部有病变。处理异质性数据如果你手上有不同中心、不同磁场强度的扫描数据别直接扔到一起分割。最好先按扫描参数分组分别做质量检查再统一到同一预处理管线。不同场强下T1对比度差异会影响组织分割的边界判定。6. 关于分割参数我最后想说的话处理fMRI数据这几年我最大的感受是分割这个环节参数设置远没有你想象的那么“自动”。SPM的Segment做得再智能它也只是一个工具真正决定输出质量的是你对数据本身的了解程度。拿到一批新数据我会花15分钟做三件事一看扫描序列的完整参数表确认TR、TE、翻转角、层面数、采集顺序二随机抽一个被试用MRIcron把DICOM或NIfTI打开逐层翻一遍确认没有明显的大面积伪影三跑一遍slice timing和segment后把结果图截出来人工看一眼。这三件事做完数据能不能直接用我心里基本就有数了。最后再分享一个小技巧做分割之前在Linux终端或MATLAB里先把每个被试的文件权限和路径统一检查一遍。我之前就因为在Windows上同步数据时文件后缀变成了大写导致批处理脚本在一个被试手上卡住后面所有被试全部白跑。数据管理这件事上偷懒后面大概率会加倍还回去的。