3. 医学影像文件格式与数据管理
在3D医学影像标注与审核工程中,数据进入标注平台之前,首先要解决三个基础问题:影像以什么格式存储、一个检查包含哪些序列、以及患者隐私信息如何剥离。这三个问题分别对应文件格式解析、序列组织与元数据读取、匿名化处理。理解它们,才能保证后续标注坐标、体素间距和方向信息在整个流水线中保持一致。
一、三种主流格式的定位与差异
DICOM(Digital Imaging and Communications in Medicine)是临床设备输出的原生格式,也是医院PACS系统的通用交换标准。它把像素数据和元数据封装在同一个文件中,一个CT或MR检查通常由几十到上千个切片文件组成,每个文件携带患者信息、设备参数、层厚、层间距、窗宽窗位以及像素数据。DICOM的核心价值在于“临床完整性”,但它的多文件结构对三维重建和标注并不友好。
NIfTI(Neuroimaging Informatics Technology Initiative)是神经影像与科研分析领域最常用的格式,通常以单个 .nii 或压缩的 .nii.gz 文件保存整个三维体数据,配合一个仿射矩阵(affine matrix)描述体素坐标到世界坐标的映射。NIfTI的优点是单文件、易读取、与深度学习框架配合顺畅,缺点是元数据相对精简,缺少DICOM那样完整的设备与采集信息。
NRRD(Nearly Raw Raster Data)常用于扩散张量成像、剂量分布和部分科研数据集,它用一个文本头(header)描述维度、间距、方向、编码方式,数据体可以独立存储。NRRD对多分量数据和方向信息的表达比较灵活,适合需要保留方向矩阵的标注任务。
二、序列组织:从文件堆到可标注的检查
拿到一个DICOM目录时,不能简单地把所有 .dcm 文件读成一个体数据。一个检查可能包含多个序列:平扫、增强、不同重建核、定位像、剂量报告等。正确做法是先按 SeriesInstanceUID 分组,再在每个序列内按 InstanceNumber 或 ImagePositionPatient 沿扫描方向排序。对于轴位CT,通常按 z 坐标升序排列;对于矢状位或冠状位,排序轴会变化,必须依据 ImageOrientationPatient 判断。
排序完成后还要检查层间距是否均匀。如果相邻切片间距不一致,直接堆叠会导致三维重建拉伸或压缩。此时应读取 SliceThickness 与 SpacingBetweenSlices,必要时按实际位置重采样到等间距网格。一个常见的教学示例是:某CT序列共 180 层,层厚 1.0 mm,层间距 1.0 mm,重建后体数据尺寸为 512×512×180,体素间距为 (0.7, 0.7, 1.0) mm。这个间距必须写入后续NIfTI的 pixdim 字段,否则标注框在三维空间中的实际尺寸会出错。
三、元数据读取:标注坐标的“锚点”
元数据读取的目标不是把所有字段都打印出来,而是提取影响几何与标注的关键字段。对DICOM而言,至少需要:Rows、Columns、PixelSpacing、SliceThickness、ImagePositionPatient、ImageOrientationPatient、RescaleSlope、RescaleInterrupt。其中 RescaleSlope 和 RescaleInterrupt 用于把存储的整数值转换为真实的CT值(HU):
HU = pixel_value * RescaleSlope + RescaleInterrupt
# 典型 CT:RescaleSlope = 1, RescaleInterrupt = -1024
# 存储值 0 对应 -1024 HU(空气),存储值 1024 对应 0 HU(水)
如果忽略这一步,窗宽窗位设置就会完全错位,标注时看到的“软组织”可能实际是骨骼。对NIfTI而言,关键字段是 pixdim(体素间距)、sform/qform(方向与原点)以及 datatype。读取后应打印仿射矩阵,确认体素坐标到世界坐标的映射方向。对NRRD而言,重点检查 space directions、space origin 和 encoding,确保读取器按正确的字节序和压缩方式解析数据体。
四、匿名化处理:合规与可追溯的平衡
DICOM文件中的患者姓名、ID、出生日期、检查日期、机构名称等都属于受保护健康信息(PHI)。匿名化不是简单删除几个字段,而是要在保留影像几何与标注可用性的前提下,替换或移除可识别信息。常用策略包括:将 PatientName 替换为统一编号,将 PatientID 映射为哈希值,将 StudyDate 偏移为相对天数,移除 InstitutionName、ReferringPhysicianName 等字段。
需要特别注意的是,DICOM的私有标签(private tags)和像素数据中的 burned-in annotation(烧录标注)也可能包含患者信息。前者需要检查 (gggg,eeee) 私有块,后者需要借助OCR或人工抽检。对于NIfTI和NRRD,虽然元数据较少,但文件名本身可能包含患者ID,必须在入库时重命名。一个可执行的匿名化检查清单如下:
| 检查项 | DICOM | NIfTI / NRRD |
|---|---|---|
| 患者姓名/ID | 替换为研究编号 | 检查文件名与头字段 |
| 出生日期/检查日期 | 偏移或置空 | 通常无,但需确认 |
| 机构/医师信息 | 移除 | 通常无 |
| 私有标签 | 逐块检查并清理 | 不适用 |
| 烧录标注 | 抽检像素区域 | 抽检像素区域 |
| 几何信息 | 必须保留 | 必须保留 |
SeriesInstanceUID 的映射关系或重新生成新的UID,否则同一检查的多个序列在后续合并时可能发生冲突。同时,匿名化操作应记录日志,保证可追溯但不可逆推患者身份。五、格式转换中的一致性验证
从DICOM转换到NIfTI时,最容易出错的三个点是:方向矩阵、原点位置和体素间距。建议在转换后做一次“回读验证”:用同一套坐标分别读取原始DICOM和转换后的NIfTI,取一个已知解剖点(如肝脏某血管分叉),比较其世界坐标是否一致。若偏差超过半个体素,说明仿射矩阵或排序方向有误。对于NRRD,还要确认 space 字段是 left-posterior-superior 还是 right-anterior-superior,不同约定会导致左右方向翻转。
在实际工程中,建议把“格式解析—序列组织—元数据提取—匿名化—一致性验证”固化为一条可重复执行的数据入库流水线。每次导入新数据时自动输出一份数据质量报告,记录序列数量、体素间距、方向矩阵、匿名化字段清单和验证结果。这样,标注人员拿到的就是几何一致、隐私合规、可直接进入标注工具的体数据,审核人员也能依据报告快速判断数据是否可用。