4. 图像预处理与归一化
在 nnU-Net 的完整流水线中,预处理是决定分割上限的关键一环。网络本身并不“理解”CT 的亨斯菲尔德单位(HU)或 MRI 的任意灰度值,它只看到被整理成统一尺度、统一间距、统一空间范围的体素张量。nnU-Net 的自动化优势,很大程度上来自它把预处理规则从“人工调参”变成了“由数据集指纹推导”。本节围绕四个核心操作展开:CT 的 HU 窗口化、MRI 的 z-score 归一化、非零区域裁剪,以及重采样到目标间距。
一、为什么必须做强度归一化
不同模态的原始强度含义完全不同。CT 的像素值是有物理意义的 HU:空气约 −1000,水为 0,骨骼可达 +1000 以上,金属植入物甚至超过 +3000。而 MRI 没有绝对标度,同一台设备不同序列、不同线圈、不同受试者之间灰度分布差异巨大,且存在偏置场。如果直接把原始值送入网络,梯度会被大数值主导,收敛困难,模型也无法跨病例泛化。因此 nnU-Net 按模态分流处理:CT 走基于 HU 的截断与缩放,MRI 走基于前景统计的 z-score。
二、CT:HU 窗口化
CT 预处理的第一步是“裁剪到有意义的 HU 区间”,再线性映射到 [0,1]。nnU-Net 默认使用全局前景强度百分位数来确定上下界,而不是固定写死。典型做法是:先收集所有训练病例中前景体素的 HU 分布,取 0.5% 和 99.5% 分位数作为 clip 边界,记为 a 和 b,然后执行:
# CT 强度归一化(示意)
a, b = np.percentile(foreground_hu, [0.5, 99.5])
x = np.clip(x, a, b)
x = (x - a) / (b - a) # 映射到 [0,1]
这样做的意义在于:把腹部 CT 中常见的 −1000 到 +3000 压缩到稳定区间,同时保留软组织与病灶的对比度。若数据集包含大量骨骼或金属,分位数会自动把上界抬高;若只关注软组织,上界会被压低,从而增强软组织对比。需要注意,clip 边界必须由训练集统计得到,并在验证与测试时复用同一组 a、b,否则会造成分布偏移。
三、MRI:z-score 归一化
MRI 采用 z-score:先计算前景体素的均值 μ 与标准差 σ,再执行 (x − μ) / σ。nnU-Net 的关键细节是“只在前景上统计”。如果对整幅图像(含大量背景零值)统计,均值和方差会被背景拉偏,前景对比度被削弱。因此通常先做非零掩膜,再在掩膜内计算统计量:
# MRI z-score(示意)
mask = x > 0
mu, sigma = x[mask].mean(), x[mask].std()
x = (x - mu) / (sigma + 1e-8)
x = np.clip(x, -5, 5) # 抑制极端离群值
裁剪到 [−5, 5] 是为了防止个别高亮体素(如脂肪或伪影)主导梯度。对于多通道 MRI(如 T1、T2、FLAIR),nnU-Net 会对每个通道分别归一化,因为各通道的强度分布并不一致。
四、非零区域裁剪
医学影像中大量体素是背景零值。以腹部 CT 为例,一幅 512×512×100 的体数据中,真正包含解剖结构的区域可能只占 60%–70%。非零区域裁剪的目标是找到前景的最小外接包围盒(bounding box),把背景裁掉,从而减少显存占用、加快训练,并让网络更聚焦于有效区域。
实现上通常先对图像做二值化(x > 0),再沿三个轴分别找非零索引的最小值与最大值,得到包围盒坐标,最后对图像和标签同时裁剪。需要注意两点:一是裁剪必须保留一定 margin(如 2–5 体素),避免边界解剖被切掉;二是如果某病例前景极小或为空,需要设置兜底策略,防止裁剪后尺寸为 0。nnU-Net 在训练时还会结合 patch 采样,裁剪后的数据再按目标 patch 大小随机取块。
五、重采样到目标间距
不同扫描的体素间距(spacing)差异很大:CT 常见 0.7×0.7×1.0 mm 或 0.6×0.6×5.0 mm,MRI 可能 1.0×1.0×1.0 mm 或 0.5×0.5×3.0 mm。如果直接输入网络,同一解剖结构在不同病例中占据的体素数不同,卷积核的感受野物理意义也不一致。因此 nnU-Net 会把所有数据重采样到统一的目标间距。
目标间距的确定遵循数据集指纹:通常取所有训练病例各轴间距的中位数,再根据各向异性程度做调整。例如某数据集 x、y 轴间距中位数为 0.7 mm,z 轴为 3.0 mm,则目标间距可能设为 0.7×0.7×3.0 mm;若 z 轴过厚,可能下采样到 1.0 mm 以平衡。重采样使用三阶样条插值处理图像,使用最近邻插值处理标签,保证标签类别不被插值破坏。重采样后,图像尺寸会变化,需同步更新标签尺寸,并记录原始 spacing 与目标 spacing 的缩放因子,以便推理时把预测结果映射回原始空间。
示例参数(合理假设,非实测):某腹部 CT 数据集,训练集 40 例,原始 spacing 范围 x/y 为 0.6–0.8 mm、z 为 1.0–5.0 mm。统计得到中位 spacing 为 0.7×0.7×2.0 mm,前景 HU 的 0.5% 与 99.5% 分位数为 −980 与 320。则归一化参数 a=−980、b=320,目标间距设为 0.7×0.7×2.0 mm。裁剪后平均尺寸从 512×512×120 降至约 380×300×90,显存占用下降约 55%。
六、四个操作的协同关系
这四步并非孤立:强度归一化解决“值域”问题,非零裁剪解决“空间冗余”问题,重采样解决“物理尺度”问题。nnU-Net 把它们串成一条确定性的预处理链,并在训练前一次性完成,推理时复用同一套参数。工程实现中,建议把归一化统计量、目标间距、裁剪 margin 等写入配置文件或数据集指纹文件,确保训练、验证、测试、部署四个阶段完全一致。任何一步参数漂移,都会让模型在真实数据上出现性能下降,而这种下降往往难以从损失曲线上直接察觉。
实践提示:调试预处理时,建议先可视化归一化前后的直方图与中间切片。CT 归一化后前景应集中在 [0,1] 且软组织对比清晰;MRI z-score 后前景均值接近 0、标准差接近 1。若发现前景被压扁或背景被放大,优先检查统计量是否只在前景上计算,以及 clip 边界是否合理。