2. 医学影像数据基础

医学影像标注平台的第一道门槛不是画框工具,而是数据本身。标注工程师面对的不是普通图片,而是带有患者信息、设备参数、空间几何和灰度映射规则的 DICOM 对象。理解这些对象的结构,才能正确地把像素还原成可判读的影像,并把标注结果写回正确的空间位置。

DICOM:影像的“容器 + 说明书”

DICOM(Digital Imaging and Communications in Medicine)既定义文件格式,也定义网络传输协议。一个 DICOM 文件由文件头和数据集组成,数据集是一系列“标签(Tag)—值表示(VR)—值长度—值”的数据元素。标签用 (组号, 元素号) 表示,例如 (0010,0010) 是患者姓名,(0028,0010) 是图像行数,(7FE0,0010) 是像素数据。VR 决定值的类型,如 PN(人名)、UI(唯一标识)、US(无符号短整型)、OB(字节串)。

对标注平台而言,最关键的标签分四类:患者与检查标识(PatientID、StudyInstanceUID、SeriesInstanceUID、SOPInstanceUID),用于去重和关联;像素与灰度(Rows、Columns、BitsAllocated、BitsStored、PixelRepresentation、RescaleSlope、RescaleIntercept),用于解析像素;空间几何(ImagePositionPatient、ImageOrientationPatient、PixelSpacing、SliceThickness、SliceLocation),用于把像素坐标映射到患者坐标;显示参数(WindowCenter、WindowWidth),用于初始窗宽窗位。UID 是跨系统关联的唯一键,平台入库时应以 StudyInstanceUID 建检查、SeriesInstanceUID 建序列、SOPInstanceUID 建实例,避免用文件名或患者姓名做主键。

常见模态:CT、MR、PET、US 的差异

不同模态的像素含义和标注关注点差别很大。CT 的像素经 RescaleSlope/Intercept 线性变换后得到 HU(Hounsfield Unit),空气约 −1000 HU,水为 0 HU,骨可达 +1000 HU 以上,因此 CT 标注常按 HU 阈值区分组织。MR 没有统一的物理量纲,信号强度依赖序列(T1、T2、DWI、FLAIR 等),同一组织在不同序列上灰度可能相反,标注时必须绑定序列语义。PET 的像素是放射性浓度,常配合 SUV 归一化,病灶勾画关注代谢活性而非解剖边界。US 是实时采集的扇形或线阵图像,像素与探头位置相关,常缺少完整空间几何,标注多以二维区域为主。

下表给出四类模态在标注平台中的典型处理差异(参数为常见示例,实际以设备输出为准):

模态像素物理含义典型窗宽窗位标注关注点
CTHU(经 Rescale 变换)肺窗 W1500/L−600,纵隔 W400/L40器官边界、病灶、骨结构
MR相对信号强度按序列经验设定,无统一值序列绑定、多序列配准
PET放射性浓度 / SUV常用 SUV 阈值显示代谢灶勾画、与 CT 融合
US回波强度设备实时调节二维区域、动态帧

影像序列与体数据组织

一次检查(Study)包含多个序列(Series),一个序列包含多张实例(Instance)。CT/MR 的体数据通常由同一序列内按 SliceLocation 或 ImagePositionPatient 排序的断层组成。平台需要按几何位置而非文件顺序排序,否则重建的体数据会错层。判断一个序列能否构成体数据,可检查:层间距是否均匀、方向向量是否一致、行列数和 PixelSpacing 是否相同。若不一致,应作为独立二维序列处理,或先做重采样。

重建体数据时,常用做法是把每层像素按 ImageOrientationPatient 的行、列方向向量和 ImagePositionPatient 原点,映射到患者坐标系。像素坐标 (i, j, k) 到患者坐标 (x, y, z) 的关系可写为:

P = Origin + i * (PixelSpacing_col * RowDir)
          + j * (PixelSpacing_row * ColDir)
          + k * (SliceSpacing * NormalDir)
其中 NormalDir = RowDir × ColDir

标注结果若以像素坐标存储,跨序列或跨设备复用时必须同时保存该映射参数,否则体素位置会漂移。

窗宽窗位与像素数据解析

DICOM 像素常以 12~16 位存储,显示器只能表现 8 位灰度,因此需要窗宽窗位(WW/WL)做线性映射。设原始像素经 Rescale 后为 v,则显示灰度 g 的计算为:

lower = WL - WW / 2
upper = WL + WW / 2
g = 255 * (v - lower) / (upper - lower)
g = clamp(g, 0, 255)

例如 CT 肺窗 WL=−600、WW=1500,则 lower=−1350、upper=150,低于 −1350 HU 显示为黑,高于 150 HU 显示为白,中间线性拉伸。标注平台应允许用户实时调节 WW/WL,并把当前窗值作为视图状态保存,而不是修改原始像素。

像素解析的完整链路是:读取 (7FE0,0010) 原始字节 → 按 BitsAllocated、PixelRepresentation 解包为整数 → 若为有符号则做补码转换 → 应用 RescaleSlope/Intercept 得到物理值 → 按 WW/WL 映射为显示灰度。常见坑包括:多帧图像需按 NumberOfFrames 拆分;压缩传输语法(如 JPEG Lossless)需先解码;BitsStored 小于 BitsAllocated 时高位可能是填充位,需按 HighBit 对齐。

实操建议:入库时对每个序列计算并缓存几何一致性检查结果(层间距方差、方向向量夹角、行列数一致性),标注界面加载时优先使用缓存,避免每次重新解析全部实例。
DICOM 像素解析与体数据组织链路 DICOM 文件 文件头 + 数据集 (7FE0,0010) 像素 BitsAllocated/Stored PixelRepresentation RescaleSlope/Intercept WindowCenter/Width ImagePosition/Orientation PixelSpacing 像素解析步骤 ① 解包为整数 按 BitsAllocated 对齐 ② 有符号补码转换 PixelRepresentation=1 ③ Rescale 变换 v = slope × raw + intercept ④ 窗宽窗位映射 g = 255×(v−lower)/(upper−lower) ⑤ 显示灰度输出 clamp 到 0~255 ⑥ 几何映射 像素坐标 → 患者坐标 ⑦ 体数据重建 按 SliceLocation 排序 标注平台可用输出 二维显示视图 WW/WL 可调,原始像素不变 视图状态独立保存 体数据 / 多平面重建 层间距均匀、方向一致 支持轴位/冠状/矢状 标注坐标存储 像素坐标 + 几何映射参数 跨序列复用不漂移 序列一致性检查 层间距方差、方向夹角 行列数 / PixelSpacing 一致 示例:CT 肺窗 WL=−600、WW=1500 → lower=−1350、upper=150;HU≤−1350 显示黑,HU≥150 显示白

把上述链路落到平台实现,建议在数据接入层完成三件事:一是按 UID 建立检查—序列—实例三级索引;二是对每个序列做几何一致性检查并缓存结果;三是把像素解析与显示映射分离,原始像素只读,窗宽窗位和视图状态作为会话数据保存。这样标注结果才能既准确又稳定地复用到后续训练和复核流程中。