2. 医学影像数据获取与格式解析

三维可视化与测量的第一步,是把“图像”还原成“带物理坐标的三维数据体”。这一步做错,后面无论重建算法多好,测量结果都不可信。本节围绕三件事展开:不同模态的成像原理决定了体素值代表什么;DICOM 标准决定了这些体素如何被组织和索引;体素与空间坐标系统决定了如何把像素索引换算成毫米、如何判断左右上下前后。

一、三种模态的成像原理与体素含义

CT 利用 X 线穿过人体后的衰减差异成像。X 线管与探测器绕患者旋转,重建得到每个体素的线性衰减系数,再经标定转换为 CT 值(HU,Hounsfield Unit):水为 0 HU,空气约 −1000 HU,致密骨可达 +1000 HU 以上。因此 CT 的体素值是定量的,可直接用于阈值分割(如骨窗、肺窗)和骨密度测量。

MRI 不测衰减,而是利用氢质子在主磁场 B₀ 中的进动与射频激励。通过梯度磁场实现空间编码:选层梯度决定层面位置,相位编码与频率编码决定层内位置。不同脉冲序列(T1WI、T2WI、DWI 等)产生不同对比度,体素值是无量纲的相对信号强度,不具备绝对物理量纲,因此 MRI 分割通常依赖多序列组合与区域生长,而非固定阈值。

PET 属于发射断层成像:注入的放射性示踪剂(如 ¹⁸F-FDG)衰变发射正电子,与电子湮灭产生一对方向相反的 511 keV γ 光子,被环状探测器符合探测。重建得到的是放射性浓度分布,临床常用 SUV(标准化摄取值) 表示代谢活性。PET 空间分辨率低(约 4–6 mm),常与 CT 或 MRI 融合,用解剖图像提供定位、用 PET 提供功能信息。

下表对比三种模态在三维处理中的关键差异:

模态体素值含义典型层厚三维处理要点
CTCT 值(HU),定量0.5–1.25 mm阈值分割、骨/软组织窗
MRI相对信号强度,无量纲1–5 mm多序列配准、区域生长
PET放射性浓度 / SUV3–5 mm与 CT/MRI 融合、阈值取 SUVmax 百分比

二、DICOM 标准:从像素到可定位数据

DICOM(Digital Imaging and Communications in Medicine)不只是图像格式,而是一套包含数据字典、信息模型和网络协议的标准。一个 DICOM 文件由文件头与数据集组成,数据集由若干数据元素构成,每个元素用 (组号, 元素号) 唯一标识,例如 (0028,0010) 是 Rows,(0028,0030) 是 Pixel Spacing,(0020,0032) 是 Image Position Patient。

三维重建最依赖的标签包括:

  • Pixel Spacing (0028,0030):行、列方向像素间距,单位 mm,如 [0.7, 0.7]。
  • Slice Thickness (0018,0050) 与 Spacing Between Slices (0018,0088):层厚与层间距,二者可能不等。
  • Image Position Patient (0020,0032):该层左上角体素在患者坐标系中的 (x, y, z),单位 mm。
  • Image Orientation Patient (0020,0037):行、列方向余弦,定义图像平面朝向。
  • Rescale Slope/Intercept (0028,1053/1052):把存储的像素值转为 HU 等物理值。

一个常见陷阱是:层间距不等于层厚。若层厚 1 mm、层间距 1.5 mm,则体素在 z 方向是各向异性的,直接按等立方体重建会拉伸或压缩解剖结构。此外,同一序列的层可能并非严格平行或等间距,需按 Image Position Patient 排序并检查间距一致性。

读取 DICOM 后务必先做一致性检查:同一 Series 内 Pixel Spacing 是否一致、层位置是否单调、Rescale 参数是否统一。任何一项异常都会导致后续测量出现系统性偏差。

三、体素与空间坐标系统

体素是三维数据的最小单元,由索引 (i, j, k) 定位。要把索引变成毫米坐标,需要三个要素:体素尺寸、原点位置、坐标轴方向。以患者坐标系(LPS:+x 向左、+y 向后、+z 向头)为例,体素中心坐标可写为:

P(i,j,k) = IPP + i·(Δr·RowCos) + j·(Δc·ColCos) + k·(Δs·NormalCos)

其中:
  IPP      = Image Position Patient(首层左上角体素中心)
  Δr, Δc   = Pixel Spacing 的行、列间距(mm)
  Δs       = 层间距(mm)
  RowCos   = 行方向余弦(Image Orientation 前 3 个值)
  ColCos   = 列方向余弦(Image Orientation 后 3 个值)
  NormalCos= RowCos × ColCos(层法向)

需要注意:DICOM 的 Image Position Patient 通常指左上角体素的中心,而部分工具按角点处理,二者相差半个体素。做多模态配准或与外部测量设备对齐时,必须统一这一约定。

下图给出从 DICOM 序列到三维体数据、再到患者坐标的完整数据流,并标出关键参数在链路中的作用位置:

DICOM 序列 → 三维体数据 → 患者坐标 数据流 DICOM 序列 多层 2D 切片 (0028,0030) Pixel Spacing (0018,0050) Slice Thickness (0020,0032) IPP (0020,0037) Orientation 排序/校验 三维体素网格 索引 (i, j, k) · 各向异性体素 坐标变换 患者坐标系 (LPS) +x 向左 · +y 向后 · +z 向头 P = IPP + i·Δr·RowCos + j·Δc·ColCos + k·Δs·NormalCos 单位:mm 三种模态的体素值语义与三维处理策略 CT X 线衰减 → HU(定量) 水 0 HU · 空气 −1000 HU 骨 > +1000 HU 策略:阈值分割 + 骨窗 层厚 0.5–1.25 mm MRI 氢质子进动 + 梯度编码 T1WI / T2WI / DWI 信号强度无量纲 策略:多序列配准 + 区域生长 层厚 1–5 mm PET 正电子湮灭 → 511 keV γ 符合探测 → 放射性浓度 SUV 表示代谢活性 策略:与 CT/MRI 融合 分辨率 4–6 mm

四、实操:从 DICOM 到可测量体数据

以 Python + pydicom + SimpleITK 为例,一个稳健的读取流程如下:

import pydicom, numpy as np, SimpleITK as sitk

# 1. 读取序列并按 Image Position Patient 排序
slices = [pydicom.dcmread(f) for f in dicom_files]
slices.sort(key=lambda s: float(s.ImagePositionPatient[2]))

# 2. 校验一致性
spacings = {tuple(map(float, s.PixelSpacing)) for s in slices}
assert len(spacings) == 1, "Pixel Spacing 不一致"

# 3. 组装体数据并应用 Rescale
volume = np.stack([s.pixel_array * float(s.RescaleSlope)
                   + float(s.RescaleIntercept) for s in slices])

# 4. 构造 SimpleITK 图像,写入物理间距与原点
img = sitk.GetImageFromArray(volume)
img.SetSpacing((float(slices[0].PixelSpacing[1]),
                float(slices[0].PixelSpacing[0]),
                float(slices[0].SpacingBetweenSlices)))
img.SetOrigin(tuple(map(float, slices[0].ImagePositionPatient)))
sitk.WriteImage(img, "volume.nii.gz")

运行后应检查三件事:Spacing 是否为 (0.7, 0.7, 1.5) 这类真实物理尺寸;Origin 是否与首层 IPP 一致;用 sitk 的 TransformIndexToPhysicalPoint 把某个索引转成毫米坐标,再与手工公式核对。若两者相差半个体素,说明原点约定不一致,需要修正。

判断体素是否各向同性:比较 Spacing 三个分量。若 z 方向明显大于 x/y,重建时应先做插值重采样到等立方体素,否则表面渲染会出现“阶梯”或方向性拉伸。

五、坐标系统的一致性检查

三维测量中最容易出错的是坐标系混用。常见有三套:体素索引坐标(i, j, k)、患者坐标(LPS,单位 mm)、世界/显示坐标(部分软件使用 RAS,即 +x 向右、+y 向前、+z 向头)。LPS 与 RAS 的 x、y 方向相反,转换时需取负。

做多模态融合时,应统一到同一坐标系后再配准。例如把 PET 重采样到 CT 网格:先读取两者 IPP 与 Orientation,用 SimpleITK 的 ResampleImageFilter 以 CT 为参考,设置恒等变换与线性插值,输出与 CT 同尺寸、同 Spacing、同 Origin 的 PET 体数据。完成后用同一索引取两者体素,确认解剖位置对齐。

最后给出一个可复用的检查清单,用于每次数据导入后快速验证:

  • 同一 Series 内 Pixel Spacing、Rescale 参数是否一致;
  • 层位置是否单调递增、间距是否均匀;
  • Spacing 三分量是否与预期层厚/层间距吻合;
  • Origin 是否等于首层 IPP;
  • 索引→物理坐标换算与手工公式是否一致(注意半体素偏移);
  • 多模态数据是否已统一到同一坐标系与同一网格。

只有把模态语义、DICOM 标签和坐标变换三者对齐,后续的三维重建、分割与测量才具备可重复性和临床可比性。