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 提供功能信息。
下表对比三种模态在三维处理中的关键差异:
| 模态 | 体素值含义 | 典型层厚 | 三维处理要点 |
|---|---|---|---|
| CT | CT 值(HU),定量 | 0.5–1.25 mm | 阈值分割、骨/软组织窗 |
| MRI | 相对信号强度,无量纲 | 1–5 mm | 多序列配准、区域生长 |
| PET | 放射性浓度 / SUV | 3–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 排序并检查间距一致性。
三、体素与空间坐标系统
体素是三维数据的最小单元,由索引 (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 到可测量体数据
以 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 把某个索引转成毫米坐标,再与手工公式核对。若两者相差半个体素,说明原点约定不一致,需要修正。
五、坐标系统的一致性检查
三维测量中最容易出错的是坐标系混用。常见有三套:体素索引坐标(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 标签和坐标变换三者对齐,后续的三维重建、分割与测量才具备可重复性和临床可比性。