1. 课程导入与工程全景
医学影像预处理与标准化,指的是在影像进入诊断阅读、定量分析或机器学习模型之前,对原始 DICOM 数据所做的一整套工程化处理:包括格式解析与元数据校验、灰度归一化、重采样与几何对齐、去噪与偏置场校正、强度标准化、掩膜与裁剪、以及最终以可复现的方式输出为 NIfTI、NPZ 或张量格式。它的目标不是"让图像更好看",而是让不同设备、不同中心、不同时间采集的影像,在同一套数值与几何约定下变得可比、可算、可复现。
要理解这门课的位置,可以把一条典型的临床与科研 pipeline 拆成五段:采集 → 预处理与标准化 → 建模/分析 → 评估与验证 → 归档与复用。预处理处在第二段,却决定了后面三段的成败。原始 DICOM 里,同一台 CT 的 HU 值有物理意义,但 MRI 的灰度是任意的;不同扫描仪的层厚、像素间距、方向余弦、窗宽窗位、甚至患者体位标记都可能不同。如果这些差异不在这里被消除,模型学到的往往是"哪台机器拍的",而不是"病灶长什么样"。
上图中,预处理内部六个环节并非必须全部执行,而是要根据模态与任务取舍。例如 CT 肺结节检测通常保留 HU 并做窗宽窗位截断,而 MRI 脑肿瘤分割则更依赖 N4 偏置场校正与 Z-score 标准化。判断依据是:该步骤是否消除了与任务无关的变异,同时保留了与任务相关的信号。
一个可执行的最小预处理示例
下面以单例脑部 MRI 为例,给出一个可运行的最小预处理片段。示例参数为教学假设值,实际使用时应根据数据统计调整。
import nibabel as nib
import numpy as np
from scipy.ndimage import zoom
img = nib.load("sub-01_T1w.nii.gz")
data = img.get_fdata().astype(np.float32)
zooms = img.header.get_zooms()[:3] # 例如 (1.0, 1.0, 3.0)
# 1) 重采样到 1×1×1 mm 等距
target = (1.0, 1.0, 1.0)
factors = [z / t for z, t in zip(zooms, target)]
data_iso = zoom(data, factors, order=1)
# 2) 百分位裁剪 + Z-score 标准化
p1, p99 = np.percentile(data_iso, [1, 99])
data_clip = np.clip(data_iso, p1, p99)
data_norm = (data_clip - data_clip.mean()) / (data_clip.std() + 1e-8)
print("原始尺寸:", data.shape, "重采样后:", data_iso.shape)
print("标准化后均值/标准差:", data_norm.mean(), data_norm.std())
运行后应观察三个量:重采样后的体素尺寸是否接近 1×1×1 mm;标准化后均值是否接近 0、标准差是否接近 1;以及裁剪是否去除了极端亮斑(如脂肪或伪影)。若标准差仍远大于 1,说明数据中存在未处理的强偏置场或异常值,需要回到 N4 或更稳健的裁剪策略。
本课程后续将围绕这条 pipeline 逐段展开:从 DICOM 元数据与几何约定,到重采样、去噪、偏置场校正、强度标准化、掩膜与裁剪,再到批处理、版本管理与质量检查。每一节都会给出可运行的代码、可观察的中间结果与判断依据,使读者不仅能"跑通",更能"跑对"。