3. DICOM标准深度解析

在医学影像组学数据标准化工程中,DICOM 是所有下游特征的“源头格式”。如果对 DICOM 文件结构、元数据元素、传输语法和像素数据封装方式理解不深,后续的组学提取就会出现标签错位、HU 值失真、ROI 与像素矩阵对不上等问题。本节从工程视角拆解 DICOM 文件,并说明它与组学数据提取接口之间的对应关系。

一、DICOM 文件的三段式结构

一个标准 DICOM 文件(Part 10 文件)由三部分组成:128 字节前导(Preamble)、4 字节 “DICM” 前缀,以及其后的数据集(Dataset)。前导区通常填 0,可被某些厂商用于私有信息;前缀是识别文件是否为 DICOM 的“魔数”。真正承载信息的是数据集,它由一系列数据元素(Data Element)顺序排列构成。

每个数据元素由四部分构成:标签(Tag)、值表示(VR, Value Representation)、值长度(VL, Value Length)和值域(Value Field)。标签是 4 字节无符号整数,形如 (组号, 元素号),例如 (0010,0010) 表示患者姓名,(0028,0010) 表示图像行数。VR 描述数据类型,如 PN(人名)、UI(唯一标识)、US(无符号短整型)、OB(字节串)等。VL 指明值域字节数。理解这一层,是解析任何 DICOM 文件的基础。

二、元数据元素:从患者信息到像素描述

DICOM 标签按组号可大致分为几类:

  • 患者与检查信息(0010、0008 组):PatientName、PatientID、StudyInstanceUID、SeriesInstanceUID、Modality、StudyDate 等,是组学数据分组、去重和溯源的关键。
  • 设备与采集参数(0018 组):KVP、SliceThickness、PixelSpacing、ReconstructionDiameter、ConvolutionKernel 等,直接影响纹理特征的物理意义。
  • 图像与像素描述(0028 组):Rows、Columns、BitsAllocated、BitsStored、PixelRepresentation、RescaleSlope、RescaleIntercept、PhotometricInterpretation 等,是像素解码与 HU 换算的核心。
  • 像素数据(7FE0,0010):PixelData,通常位于文件末尾,是体量最大的元素。

其中 RescaleSlope 与 RescaleIntercept 尤为关键。CT 的原始像素是整数存储值,真实 HU 值需按 HU = PixelValue × RescaleSlope + RescaleIntercept 换算。若组学提取时忽略这一步,所有一阶统计量(均值、方差)和纹理特征都会系统性偏移。

三、传输语法:决定字节如何被解读

传输语法(Transfer Syntax)由 (0002,0010) 标签给出,它规定了三件事:字节序(小端/大端)、VR 编码方式(显式/隐式)、像素数据是否压缩。常见取值包括:

传输语法 UID名称特点
1.2.840.10008.1.2Implicit VR Little Endian隐式 VR,小端,未压缩
1.2.840.10008.1.2.1Explicit VR Little Endian显式 VR,小端,未压缩
1.2.840.10008.1.2.4.50JPEG Baseline有损压缩,像素需解码
1.2.840.10008.1.2.4.70JPEG Lossless无损压缩
1.2.840.10008.1.2.5RLE Lossless游程编码无损压缩

隐式 VR 下,数据元素不写 VR 字段,解析器必须查数据字典推断类型;显式 VR 下,VR 直接写在标签后。压缩传输语法下,PixelData 是封装后的码流,必须先解压才能得到像素矩阵。工程上,统一转成 Explicit VR Little Endian 未压缩格式是组学预处理最稳妥的中间态。

四、像素数据封装与组学提取接口

未压缩时,PixelData 是一段连续的字节流,按行优先排列。解析步骤为:读取 Rows、Columns、BitsAllocated、SamplesPerPixel,计算期望字节数,按 PixelRepresentation 决定有无符号,再按 BitsStored 做位掩码,最后 reshape 成二维矩阵。压缩时,PixelData 被封装为若干 Fragment,需按传输语法调用对应解码器。

组学提取接口通常接收一个三维数组(或二维切片序列)加一个掩膜(Mask)。因此 DICOM 到组学的接口关系可归纳为:元数据 → 像素解码 → HU 换算 → 空间对齐 → 特征计算。PixelSpacing 和 SliceThickness 决定纹理特征的物理尺度,ImagePositionPatient 和 ImageOrientationPatient 决定体素的空间位置,这些都必须与像素矩阵同步传入提取器。

建议在预处理阶段输出一份“DICOM 元数据清单”,至少包含:SeriesInstanceUID、Modality、PixelSpacing、SliceThickness、RescaleSlope、RescaleIntercept、BitsStored、PhotometricInterpretation,作为组学特征可追溯性的依据。
DICOM 文件结构 → 组学提取接口关系 DICOM 文件 128B Preamble "DICM" 前缀 数据集 Dataset 患者/检查信息 设备/采集参数 像素描述标签 传输语法 UID PixelData (7FE0,0010) 解析与解码 读取标签/VR/VL 查数据字典 判断传输语法 字节序/显隐式 像素流解压 (JPEG/RLE) 位深/符号处理 BitsStored 掩码 reshape 为矩阵 Rows × Columns HU = PV×Slope+Intercept 组学提取接口 输入 1:像素矩阵 float32 数组,已 HU 换算 输入 2:空间元数据 PixelSpacing / SliceThickness 输入 3:ROI 掩膜 与像素矩阵同尺寸 特征计算 一阶 / 形状 / 纹理 输出:特征向量 可追溯至 SeriesInstanceUID 关键:元数据与像素必须同步传递,否则空间特征失真

五、工程实践中的常见陷阱

第一,隐式 VR 误判:部分老设备使用隐式 VR,若解析器按显式读取,会把 VR 字节当成值长度,导致后续全部错位。第二,Rescale 遗漏:直接使用原始像素值计算纹理,CT 的 HU 范围会从 [-1000, 3000] 变成 [0, 4095],特征分布完全改变。第三,压缩像素未解码:把 JPEG 码流当原始像素 reshape,得到的矩阵毫无意义。第四,多帧与单帧混淆:NumberOfFrames 大于 1 时,PixelData 包含多帧,需按帧拆分。第五,PhotometricInterpretation 为 MONOCHROME1 时,像素值越大越暗,显示与计算需注意反转。

在批量处理时,建议先对全部文件做一次传输语法与 VR 编码的统计,识别出隐式 VR、压缩格式、多帧序列等特殊子集,再分别走不同解析分支,避免“一刀切”导致静默错误。

六、从 DICOM 到组学特征的接口约定

为了让组学提取可复现,建议在工程上固定以下接口约定:像素矩阵统一为 float32、HU 单位;空间元数据以 PixelSpacing(行、列方向)和 SliceThickness(层厚)显式传入;ROI 掩膜与像素矩阵严格同尺寸、同方向;每个特征向量附带 SeriesInstanceUID 和 SOPInstanceUID 作为溯源键。这样,无论上游是 CT、MR 还是 PET,下游特征计算器都能以一致的方式工作。

总结来说,DICOM 不是“一个图片格式”,而是一套自描述的数据容器。文件结构决定如何定位信息,元数据元素决定信息的含义,传输语法决定字节如何被解读,像素封装决定图像如何被还原。只有把这四层关系理清,组学数据标准化工程才有可靠的地基。