4. 影像数据预处理与质量控制

在医学影像临床预测模型工程中,原始 DICOM 数据几乎不可能直接送入模型。不同设备、不同扫描协议、不同重建参数带来的差异,会让同一病灶在不同中心呈现出完全不同的像素分布。预处理与质量控制的目标,是把这些异质性压缩到模型可以承受的范围,同时保留真正与临床结局相关的影像信息。本节围绕格式转换、重采样、强度归一化、去噪、伪影识别与数据清洗六个环节,讨论可落地的工程实现方式。

一、格式转换:从 DICOM 到可计算张量

DICOM 是临床存储标准,但它不是建模友好的格式。一个 CT 序列通常由数百个切片文件组成,每个文件包含像素数据与大量元数据。工程上第一步是解析 DICOM 并转换为 NIfTI 或 NumPy 数组,同时保留关键元数据:PixelSpacing、SliceThickness、RescaleSlope、RescaleIntercept、ImageOrientationPatient。其中 RescaleSlope 与 RescaleIntercept 决定如何把存储的整数值还原为物理量,CT 中即 HU 值:

HU = pixel_value * RescaleSlope + RescaleIntercept
# 典型 CT:Slope=1, Intercept=-1024
# 存储值 0 → HU=-1024(空气),存储值 1024 → HU=0(水)

若忽略这一步,直接把原始像素当强度使用,不同设备的 HU 偏移会直接污染特征。转换时还需检查切片顺序,按 ImagePositionPatient 的 z 坐标排序,避免层间错位。对于 MRI,DICOM 中通常没有统一的物理量标定,强度值本身不具备绝对意义,这决定了后续归一化策略必须与 CT 区别对待。

二、重采样:统一体素间距与空间对齐

重采样解决两个问题:各向异性体素和不同中心的空间分辨率差异。CT 常见层厚 1~5 mm,层内像素间距 0.5~1 mm,直接按数组索引计算会引入几何畸变。工程上通常把体素间距统一到各向同性,例如 1×1×1 mm³,使用三线性插值处理图像,使用最近邻插值处理掩膜,避免标签被插值成非整数类别。

重采样顺序建议先重采样再裁剪,或先按物理坐标裁剪再重采样,二者结果不同。若先裁剪后重采样,裁剪边界必须按物理坐标换算,否则 ROI 会随分辨率变化而漂移。对于 PET-CT 等多模态数据,还需以 CT 为参考空间,把 PET 配准并重采样到同一网格,保证通道间体素一一对应。

三、强度归一化:CT 与 MRI 的分野

CT 的 HU 具有物理意义,归一化通常采用固定窗宽窗位截断,再线性映射到 [0,1]。例如肺结节常用窗位 -600 HU、窗宽 1500 HU,肝脏常用窗位 50 HU、窗宽 300 HU。截断后:

lower = level - window/2
upper = level + window/2
x = clip(HU, lower, upper)
x = (x - lower) / (upper - lower)

MRI 没有绝对强度,常用 z-score 或百分位归一化。z-score 对全脑或全器官计算均值与标准差,但容易受背景和脂肪影响;百分位归一化取 1% 与 99% 分位数做截断,再映射到 [0,1],对异常高信号更稳健。工程实现中应把归一化参数按通道、按序列分别记录,推理阶段复用训练集统计量,避免数据泄漏。

四、去噪与伪影识别

低剂量 CT 噪声呈明显条纹与斑点,MRI 有 Rician 噪声。常用去噪包括高斯滤波、非局部均值和高斯-拉普拉斯金字塔,但过度去噪会抹掉小结节边缘。工程上更稳妥的做法是保留原始强度通道,同时增加一个轻度去噪通道,让模型自行选择。伪影识别则依赖规则与统计结合:金属伪影表现为高 HU 放射状条纹,运动伪影表现为层间不连续,环形伪影表现为固定半径亮暗环。可用简单阈值加连通域统计做初筛,例如统计 HU>2000 的体素占比、层间相关系数骤降、以及频域径向能量异常。

影像预处理与质量控制数据流 DICOM 序列 PixelSpacing Slope / Intercept HU 还原 pixel×Slope+Intercept 层序按 z 排序 重采样 1×1×1 mm³ 各向同性 图像三线性 / 掩膜最近邻 强度归一化 CT:窗宽窗位截断 MRI:百分位 / z-score 去噪 原始 + 轻度去噪双通道 保留边缘细节 质量控制与伪影识别 • 金属伪影:HU>2000 体素占比 > 0.5% • 运动伪影:相邻层相关系数 < 0.85 • 环形伪影:频域径向能量异常峰值 • 层厚突变 > 2× • 空层 / 重复层 • 方向矩阵异常 通过 QC? 阈值 + 人工复核 进入建模数据集 记录归一化参数 是 剔除 / 重扫 / 修复 写入质控日志 否 所有归一化统计量仅由训练集计算,验证/测试集复用,防止数据泄漏

五、数据清洗:从单例质控到队列一致性

单例通过质控后,还要做队列级清洗。常见问题包括:同一患者多次检查造成重复样本、标签与影像时间不匹配、扫描协议混杂导致强度分布漂移。工程上可先按患者 ID 去重,保留与标签时间窗最近的检查;再按协议分组,检查各组 HU 直方图是否出现双峰或整体偏移。若某中心数据整体偏亮或偏暗,应单独统计其归一化参数,而不是强行套用全局参数。

下面给出一份可直接参考的质控记录表结构,字段均围绕本节实际处理对象设计:

字段 示例值 判断依据
patient_idP000123去重主键
modalityCT决定归一化策略
slice_thickness1.25 mm重采样前记录
hu_min / hu_max-1024 / 3071检查 HU 范围合理性
metal_ratio0.12%>0.5% 触发复核
slice_corr_min0.91<0.85 判为运动伪影
norm_methodwindow_center_width记录参数供推理复用
qc_statuspass / review / reject最终处置
工程建议:把预处理写成可配置的 pipeline,每个步骤输出中间文件与统计量,便于回溯。归一化参数、重采样目标间距、窗宽窗位必须与模型权重一起版本化保存,否则推理阶段无法复现训练分布。
常见误区:在划分训练集之前就对全量数据做 z-score 或百分位归一化,会把验证集和测试集的分布信息泄漏进训练过程,导致评估指标虚高。正确做法是先划分,再仅用训练集统计量处理其余集合。

综合来看,预处理不是一次性脚本,而是一条需要持续监控的数据流水线。格式转换保证物理量正确,重采样保证空间一致,归一化压缩强度异质性,去噪与伪影识别守住质量底线,数据清洗则把单例质量提升为队列质量。只有这些环节在工程上可配置、可记录、可复现,后续的临床预测模型才具备跨中心泛化的基础。