2. 医学影像与DICOM基础

在开发DICOMweb云影像平台之前,必须先建立对DICOM标准的整体认知。很多开发者初次接触DICOM时,会把它简单理解为“一种医学图像文件格式”,这其实只对了一半。DICOM(Digital Imaging and Communications in Medicine)既是一套信息模型,也是一套网络通信协议。文件只是它的持久化形态,而DICOMweb则是把这套模型和协议搬到HTTP/REST之上的现代访问方式。理解它们之间的层次关系,是后续所有接口设计、数据解析和影像渲染工作的基础。

一、DICOM信息模型:从患者到像素的层级结构

DICOM信息模型采用自顶向下的四层实体结构,这是理解整个标准的主线:

  • Patient(患者):最顶层,由Patient ID唯一标识,包含姓名、出生日期、性别等人口学信息。
  • Study(检查):一次影像检查对应一个Study,由Study Instance UID唯一标识,例如一次胸部CT检查。一个患者可以有多次检查。
  • Series(序列):一个Study下按采集方式或重建方式划分的序列,由Series Instance UID标识。例如胸部CT的平扫序列、增强序列、冠状位重建序列各为一个Series。
  • Instance / SOP Instance(实例):最底层,通常是一张图像,由SOP Instance UID唯一标识。一个Series包含多张Instance。

这四层通过UID(Unique Identifier)逐级关联,形成“患者—检查—序列—实例”的树状结构。DICOMweb的REST路径正是照搬这一模型:/studies/{studyUID}/series/{seriesUID}/instances/{instanceUID}。因此,只要理解了信息模型的层级,就能自然理解QIDO-RS查询、WADO-RS取回和STOW-RS存储的URL设计逻辑。

DICOM 信息模型与 DICOMweb 资源映射 DICOM 信息模型(四层实体) Patient 患者 Patient ID · 姓名 · 出生日期 · 性别 Study 检查 Study Instance UID · 检查日期 · 模态 Series 序列 Series Instance UID · 序列号 · 层厚 Instance / SOP Instance 实例 SOP Instance UID · 像素数据 · 元数据 1:N 1:N 1:N DICOMweb REST 资源路径 QIDO-RS 查询 GET /studies?PatientName=Zhang WADO-RS 取回 GET /studies/{uid}/series/{uid}/instances/{uid} STOW-RS 存储 POST /studies (multipart/related) 元数据检索 GET /studies/{uid}/metadata (JSON) UID 是贯穿四层模型的唯一关联键,DICOMweb 路径直接映射该层级结构

二、像素数据与元数据:一张DICOM图像的两副面孔

每个SOP Instance内部由两大部分组成:元数据(Metadata)和像素数据(Pixel Data)。

元数据以“数据元素(Data Element)”为基本单位,每个元素由标签(Tag)、值表示(VR, Value Representation)和值长度构成。标签用两个十六进制数表示组号和元素号,例如:

  • (0010,0010) Patient Name,VR为PN
  • (0008,0060) Modality,VR为CS,值为CT、MR、US等
  • (0028,0010) Rows,VR为US,表示图像行数
  • (0028,0011) Columns,VR为US,表示图像列数
  • (7FE0,0010) Pixel Data,VR为OB或OW,存放真正的像素字节

像素数据本身并不直接等于“可显示的灰度图”。要正确渲染,必须结合元数据中的几个关键参数:Bits Allocated(分配位数,如16)、Bits Stored(有效位数,如12)、High Bit(最高位位置)、Pixel Representation(0为无符号,1为有符号)、Photometric Interpretation(MONOCHROME2、RGB等)、Rescale Slope/Intercept(将存储值转换为CT值的线性参数)。例如,CT图像中存储值经过 HU = storedValue × RescaleSlope + RescaleIntercept 才能得到亨斯菲尔德单位,窗宽窗位才能正确应用。

在DICOMweb中,WADO-RS取回的实例可以是原始DICOM(application/dicom),也可以是已转码的JPEG/PNG。若取回原始DICOM,前端需要自行解析上述参数;若由服务端转码为JPEG,则窗宽窗位已在服务端应用,前端直接显示即可。两种策略的取舍是平台设计的重要决策点。

三、SOP类:定义“这是什么对象、能做什么操作”

SOP(Service-Object Pair)类把“信息对象”和“服务”绑定在一起。常见SOP类包括:

  • CT Image Storage(1.2.840.10008.5.1.4.1.1.2):一张CT图像
  • MR Image Storage(1.2.840.10008.5.1.4.1.1.4):一张MR图像
  • Secondary Capture Image Storage:截图或后处理图像
  • Ultrasound Multi-frame Image Storage:多帧超声

SOP Class UID决定了该实例在DICOMweb中如何被识别和处理。例如,QIDO-RS查询时可以按SOPClassUID过滤;STOW-RS存储时,服务端根据SOP Class UID判断是否支持该类型。对于多帧图像,像素数据是一个三维或四维数组,需要结合NumberOfFrames等标签解析。

四、传输语法:字节流的编码规则

传输语法(Transfer Syntax)规定了DICOM数据集的编码方式,核心包括:

  • 字节序:Implicit VR Little Endian、Explicit VR Little Endian、Explicit VR Big Endian
  • VR编码:隐式VR(不写VR,靠字典推断)与显式VR(每个元素带VR)
  • 压缩方式:JPEG Baseline、JPEG Lossless、JPEG 2000、RLE等

传输语法的UID写在元数据中,解析器必须先读取它,才能正确解码后续字节。在DICOMweb场景下,WADO-RS可以通过Accept头指定期望的传输语法,服务端可进行转码;STOW-RS上传时,multipart/related的每个part都携带自己的Content-Type,服务端据此选择解析器。

五、从DICOM到DICOMweb:关系总结

把上述概念串起来看:DICOM信息模型定义了数据的层级结构,元数据和像素数据构成了实例内容,SOP类定义了对象类型与服务能力,传输语法定义了字节编码规则。DICOMweb并没有改变这些底层模型,而是把传统的DIMSE网络服务(C-FIND、C-MOVE、C-STORE)替换为HTTP上的RESTful接口:QIDO-RS对应查询,WADO-RS对应取回,STOW-RS对应存储。因此,掌握DICOM基础模型,是理解DICOMweb接口语义、正确解析响应和处理异常的前提。

实践建议:在开发初期,可以用dcm4che或pydicom加载一个真实DICOM文件,打印其数据集,观察四层UID、SOP Class UID、Transfer Syntax UID以及像素相关标签的实际取值。再对照DICOMweb的JSON元数据响应,确认字段映射关系。这一步能快速建立“文件—模型—REST资源”的对应直觉。