想象你是一位档案管理员,负责整理一家医院堆积如山的影像资料。过去,医生看完 CT 片子后,会在胶片上画几个红圈,再手写一段“肺结节,建议复查”的纸条塞进档案袋。这些信息人看得懂,电脑却一头雾水——圈画在哪里?结节是哪几层图像?纸条上的结论对应哪个病变?当你需要把上千份这样的档案交给 AI 系统处理时,简直就是灾难。 后来,DICOM 标准组织给档案管理员发了三件法宝:SR(结构化报告)是一张“一问一答”的标准化问卷卡,把医生的自由结论拆成有语义的问题和答案;SEG(分割对象)是一沓透明的彩色贴纸,把“这是肺、那是肿瘤”逐像素标在照片上;RTStruct(放疗结构集)则是一本划满靶区轮廓的作战地图册,用一串串坐标点记录放疗要照射的区域。管理员再把它们统统装进贴满标准标签(UID)的档案夹,与原始影像一一挂钩。从此,AI 和放射治疗系统都能像读数据库一样,精准地读取每一份报告。本文就带你看懂这三种档案册的设计原理与使用方法。
对 AI 从业者而言,掌握 SR、SEG、RTStruct 是让模型输出真正进入临床工作流的关键——你的分割结果、诊断结论只有封装成标准的 DICOM 对象,医院 PACS、放疗计划系统才会认账。这是一项把算法价值落地到医疗场景的核心工程能力。
目录
可视化演示
模拟DICOM SR层级树结构、SEG分割掩码叠加影像与RTStruct轮廓集标注,展示三种结构化对象的数据模型与关联方式。
本节配有交互动效(进入视口后自动加载,约 3KB)。
模式1:SR结构化报告树 根节点CONTAINS子节点构成层级树 HAS OBS CONTEXT关联观测上下文 SR = ROOT(CONTAINS, HAS_OBS_CONTEXT) SR以关系类型构建测量结果树。
DICOM对象家族:档案室里的三本册子
档案管理员小D刚上岗时,发现档案室的规矩特别多:所有资料必须装进统一样式的档案夹,封面上印着“类型编号”,里面的文件必须按标签页分门别类。DICOM 世界的规矩与此一模一样——无论 CT 影像、超声视频,还是我们关心的 SR、SEG、RTStruct,全都是“DICOM 对象”,它们共享同一套档案夹格式:前面有一小段空白前导区,紧跟着“DICM“四个魔法字符标示身份,之后是无数个”数据元素”依次排列。
每个数据元素就像档案夹里的一张标签贴纸:贴纸上写着“标签编号(组号+元素号)”“数据类型(VR)”“长度”和“内容”。比如 (0010,0010) 这个标签,内容是患者姓名;(0008,0060) 标签则记录这是一个 CT 还是 MR 图像。而决定“这本档案夹里到底该放什么内容”的,是封面上那串长长的 SOP Class UID——它相当于档案的类型编号。SR、SEG、RTStruct 各自拥有不同的 SOP Class UID,因此系统一看编号就知道该按哪套规则拆解文件。
这三本册子——问卷卡、透明贴纸、作战地图册——虽然内容天差地别,但都穿着同款 DICOM 档案夹的外衣。正因为共享同一套“装订规则”,医院的任何系统都能用同一把钥匙打开所有档案夹,再根据 SOP Class UID 决定调用哪套阅读流程。这就是医学影像生态能够互联互通的基石。
- 前导区128 个字节的空白区,用于兼容旧格式的位图头,DICOM 标准规定它一般全部为零。
- DICM 魔法标识紧接着前导区的四个 ASCII 字符,保证程序能立刻认出这是 DICOM 文件而非其他格式。
- 数据元素序列对象的主体,每个元素由“(组号,元素号)”构成的标签唯一标识,其含义由标准的数据字典规定。
SR结构化报告:一问一答的问卷卡
小D整理医生手写报告时头疼不已:“右上肺见磨玻璃结节,大小约 8mm,考虑炎性可能。”这句话信息量很大,但电脑无法自动提取“位置、大小、结论”这些结构化字段。于是他把医生的结论改写成一份标准的问卷卡:系统提问,医生或 AI 作答。这份问卷卡就是 SR 报告(Structured Report)。
SR 的核心数据结构是一棵“文档树”。树的根节点是报告的标题,比如“胸部 CT 检查报告”;往下分出一个个“内容项(Content Item)”,每个内容项本质上是一个“概念名-值”对。概念名必须来自标准编码表,比如 TID 2020 中的“Finding Site“(发现部位),值可以是文本、数值、日期,甚至可以嵌套另一个内容项子节点。为了让读卡人知道报告是在什么背景下写的,SR 里还有”观察上下文”记录:谁(观察者)、用什么设备、什么时间做的判断。
问卷卡的最大好处是“机器可读”。AI 系统可以让 SR 树的每个“答案”都对应到电子病历里的结构化字段,从而自动统计、检索、做多中心研究。而标注答案用的是什么“词典”(编码体系),则是下一节透视贴纸要面对的统一规范问题。
- 根节点计数每个 SR 文档至少有一个根内容项,它统领整棵语义树。
- 递归求和对根节点每一个子内容项 \(c\) 而言,它的子树规模同样递归地等于 1 加上自己的子节点数。
- 树的语义表达树越深,描述越精细;节点越多,信息越丰富。关系类型如 CONTAINS、HAS_OBS_CONTEXT 决定了子节点如何挂在父节点下。
SEG分割对象:能撕能贴的透明图层
小D在整理照片时,想给心肺影像做标注。他拿出一沓透明贴纸,每张贴纸只涂一种颜色:一张把肺区域涂成绿色,一张把肿瘤涂成红色。把这些贴纸叠在 CT 照片上,电脑就知道“哪些像素属于肺、哪些属于肿瘤”。SEG 分割对象(Segmentation) 干的就是这件事,只不过它的贴纸不是彩色,而是黑白位图——每一层(Segment)是一张与 CT 图像同样大小的 0/1 网格,1 表示该像素属于这个器官,0 表示不属于。
SEG 对象里每个 Segment 都有详细的“段描述”:编码的解剖部位(如 “Coded Concept Name“ 指向肺)、算法类型(人工/自动/半自动)、颜色偏好等。关键的还有它和源影像的关系:SEG 通过”参考图像序列“逐帧指明自己的掩膜对应源 CT 的哪一帧,并且在同一 Frame of Reference(参考坐标系)下保证像素一一对齐。这种”位掩膜”设计对存储极为友好。
透明贴纸能精确到像素,但贴纸一旦生成,想“挪一挪”就很麻烦。放疗科医生更需要的是能随手拖拽、按几何形状编辑的“轮廓线”,这就轮到第三件法宝 RTStruct 出场了。
- 单层掩膜位数一个 Segment 的一张掩膜图,高 \(H_s\) 行、宽 \(W_s\) 列,每像素可用 1 位表示归属与否。
- 位转字节向上取整到整字节,因为文件读写按字节对齐。
- 累加所有段\(P\) 个 Segment、每个 \(F_s\) 帧,全部相加得到对象总字节数。
RTStruct放疗结构:作战地图上的靶区册
放疗是一场精准的“定向打击”:医生要在 CT 地图上圈出肿瘤(靶区),同时避开脊髓、肺等危急器官。圈出的轮廓要交给加速器执行照射,必须精确到毫米。RTStruct(RT Structure Set) 就是这本作战地图册,它不记录逐像素贴纸,而是记录一条条由三维坐标点连成的封闭轮廓线。
RTStruct 的核心是“结构集 ROI”列表:每个 ROI(感兴趣区域)有名称(如“GTV 肿瘤”)、编号、几何类型(轮廓点集或表面网格)。每一个 ROI 下面挂着多个“轮廓层”,每一层对应源 CT 的一个切片。轮廓层的坐标是世界坐标(单位是毫米),而不是像素坐标,这意味着它和具体影像的空间位置天然绑定。此外它还有“ROI 观察”字段,记录这是靶区还是危及器官、由谁在何时勾画。
如果说 SEG 是给 AI 算法看的“像素级标注”,RTStruct 就是给放疗计划系统(TPS)用的“几何级标注”。轮廓线不但能目视编辑,还能直接计算体积、生成剂量分布。而这本地图册之所以能精准覆盖到对应图层,全靠它和影像之间那条看不见的“引用锁链”。
- 单个 ROI 的轮廓点ROI \(r\) 在第 \(k\) 层切片上有一个闭合轮廓,由 \(n_{r,k}\) 个三维点组成。
- 切片求和某 ROI 在 \(K_r\) 层切片上的轮廓点全部累加。
- ROI 汇总结构集中共有 \(R\) 个 ROI(靶区 + 危机器官),合计得总点数。
影像关联机制:档案上的互引标签
小D发现,三本册子如果不和原始影像绑定,就跟散页废纸没区别。DICOM 的聪明之处在于,所有结构化对象内部都埋着一套“引用标签”(UID),就像档案上的互引索引。SEG 要引用它分割的源影像系列,RTStruct 要引用它勾画的 CT 影像,SR 则引用它对应的检查(Study)。
这条引用链层层递进:患者 → 检查(Study Instance UID)→ 系列(Series Instance UID)→ 实例(SOP Instance UID)。更关键的是 Frame of Reference UID——它像一个“空间坐标系编号”。只有当 SEG 或 RTStruct 与影像拥有同一个 Frame of Reference UID 时,系统才能确信两者处于同一物理空间。有了 UID 链还不够,像素坐标与世界坐标之间的换算还需要两样东西:影像位置标记(Image Position Patient)和像素间距(Pixel Spacing)。
有了 UID 链定位“是哪本档案”,再有了像素坐标与世界坐标的换算公式定位“具体位置在哪”,SR 的语义结论、SEG 的像素标注、RTStruct 的几何轮廓才能严丝合缝地叠在同一张 CT 上。这条引用链是 PACS、AI 和放疗系统协同工作的地基。
- 像素原点\(P_0\) 是影像左上角第一个像素在病人坐标系中的物理坐标,由标签 (0020,0032) 给出。
- 行方向的增量每往下一行,世界坐标移动 \(\Delta_y\)(像素间距的纵向分量,单位 mm)。
- 像素索引\((i, j)\) 是该像素在影像矩阵中的行列号,从 0 开始计数。
临床应用实践:从标注到放疗的流水线
故事讲到这里,小D的三件法宝终于要在真实战场上大显身手。现代放疗工作流中,CT 影像进入 AI 分割模型后,模型直接输出 SEG 对象,标注出肿瘤和危机器官;随后放疗物理师把 SEG 转成 RTStruct,在计划系统里微调轮廓、设计照射野;最后系统生成包含剂量信息的计划文件,交付加速器执行。
另一个常见场景是影像科报告:AI 自动检测肺结节后,不再只输出一张 PNG 热图,而是生成一条 SR 文档树,直接写入 PACS 的“结构化报告”文件夹。临床医生打开 PACS 时看到的是一份带语义标签的电子报告,可与之前历次检查对比,自动追踪结节大小的变化。这三者组合起来的核心价值是:从“人看图文”升级为“机器读语义”。
从 AI 模型输出到临床决策,这条流水线上的每一步都要求数据“自描述、可追溯”。SR 让结论有出处,SEG 让标注有边界,RTStruct 让治疗有几何。临床质控人员拿着这三样东西,才能回答一个最朴素的问题:“AI 说这里有肿瘤,凭什么?——凭这本档案册里的标签和坐标。”
- 单层面积由 RTStruct 轮廓围成的多边形面积,用鞋带公式计算。
- 层厚CT 相邻两层之间的间距,通常由影像描述标签 (0018,0050) 给出。
- 逐层累加K 层全部相加,所得体积单位与面积、层厚的单位一致(如 mm³)。
设计权衡决策:每种格式都是取舍
如果小D手里有魔法,他或许想要一种格式既像 SEG 一样像素级精确,又像 RTStruct 一样可编辑,还能像 SR 一样语义丰富。但现实是,每种格式都有刻意的取舍。SEG 选择位掩膜,换来的是紧凑的空间与 AI 友好的直接使用;RTStruct 选择轮廓点集,换来的是 TPS 系统的编辑便捷与几何可计算性。若把轮廓转换成等尺寸掩膜,存储量差异可能高达一个数量级。
表达方式上,SR 坚持树状语义而非平面表单,是因为医学结论天然带层级(检查 → 发现 → 特征 → 测量值);SEG 和 RTStruct 则坚持标准编码表而非自由文本,为的是跨厂商互操作。这些决策背后都遵循同一原则:在可表达性、存储效率与临床可用性之间找平衡。
标准的演进也没有停止:DICOM 工作组持续在增强 SR 的模板约束(如 TID 1500 报告模板)、推动 SEG 扩展到多帧超声,以及定义 RTStruct 与新型粒子治疗的结合。对工程师而言,理解这些权衡,才能在“选 SEG 还是 RTStruct 输出”“SR 树该建多深”的决策中,做出符合业务约束的合理取舍。
---
- 掩膜字节数网格 \(M \times N\)、共 \(K\) 层,每像素 1 位,折算为字节。
- 轮廓字节数\(N_{\text{pt}}\) 个点,每个点含 \(x,y,z\) 三个 float32。
- 比值含义当轮廓点足够稀疏(光滑器官)时 \(\gamma \gg 1\),RTStruct 更优;当轮廓复杂密集时掩膜可能更紧凑。
AI 应用场景
放疗靶区智能勾画与格式转换
阶段:模型输出后处理
解决的问题:传统放疗靶区勾画全靠医生逐层手绘轮廓,一个病例要花一两个小时;AI 分割模型能秒级出结果,但直接输出 numpy 掩膜无法进入 TPS 系统。
具体案例:某放疗科部署肺肿瘤自动勾画系统,AI 模型在 CT 上分割出 GTV 和肺组织,后端服务将掩膜封装为 DICOM SEG 对象,再转换为 RTStruct 交给 TPS;物理师只需微调轮廓,靶区勾画时间从 90 分钟降到 15 分钟。
影像 AI 报告自动入 PACS
阶段:结果归档与交互
解决的问题:影像 AI 的常见输出是一张jpg热图和一句文字结论,无法与检查记录关联,也无法在 PACS 里做历史对比。
具体案例:肺结节筛查系统检测到结节后,自动构造 SR 文档树,记录“发现部位=右肺上叶、尺寸=8.2mm、形态=磨玻璃”,并引用当前检查的 Study UID。放射科医生在 PACS 中打开结构化报告,可一键调出历史 SR 对比结节变化。
多中心研究与数据质控
阶段:数据治理与合规
解决的问题:多中心临床试验需要统一标注格式,自由文本报告无法统计,Excel 表格又缺乏影像绑定关系。
具体案例:某肺癌筛查研究项目中,各合作医院统一使用 SEG 输出病灶分割、SR 输出测量指标,质控系统通过遍历 UID 链校验每个 SEG 都能溯源到对应 CT 帧,自动剔除引用断裂的坏数据。
Python 演示
import math def ray_cast_polygon(px, py, xs, ys): """射线法判断点是否在多边形内""" inside = False n = len(xs) j = n - 1 for i in range(n): xi, yi = xs[i], ys[i] xj, yj = xs[j], ys[j] if (yi > py) != (yj > py): x_cross = xi + (py - yi) * (xj - xi) / (yj - yi) if px < x_cross: inside = not inside j = i return inside def contour_to_mask(contour, rows, cols, origin=(0.0, 0.0), spacing=(1.0, 1.0)): """把世界坐标轮廓转换为0/1像素掩膜, 模拟SEG位平面""" mask = [[0] * cols for _ in range(rows)] ox, oy = origin dx, dy = spacing xs = [p[0] for p in contour] ys = [p[1] for p in contour] for i in range(rows): for j in range(cols): px = ox + j * dx py = oy + i * dy if ray_cast_polygon(px, py, xs, ys): mask[i][j] = 1 return mask def volume_from_masks(masks, slice_thickness, pixel_area): """按层累加体积: V = sum(A_k * dz)""" total_voxels = sum(sum(row) for m in masks for row in m) return total_voxels * pixel_area * slice_thickness def main(): # 模拟一个半径10mm的圆形肿瘤轮廓, 共60个采样点 contour = [(10.0 + 10.0 * math.cos(2 * math.pi * k / 60), 10.0 + 10.0 * math.sin(2 * math.pi * k / 60)) for k in range(60)] masks = [] for z in range(5): # 模拟5层切片 m = contour_to_mask(contour, rows=32, cols=32, origin=(0.0, 0.0), spacing=(1.0, 1.0)) masks.append(m) vol = volume_from_masks(masks, slice_thickness=2.0, pixel_area=1.0) nonzero = sum(sum(row) for m in masks for row in m) print("非零像素总数:", nonzero) print("估算体积(ml):", vol / 1000.0) main()
ray_cast_polygon(px, py, xs, ys)射线法判断某个像素中心点是否落在轮廓内部,是点集转掩膜的关键几何算法。contour_to_mask(contour, rows, cols, origin, spacing)结合原点与像素间距,把 RTStruct 的世界坐标轮廓映射到影像像素网格。mask[i][j] = 1落在轮廓内部的像素标记为 1,对应 SEG 中 1 bit 的归属位。volume_from_masks(masks, slice_thickness, pixel_area)对每层掩膜的非零像素求和,乘以像素面积与层厚,得到体积。total_voxels * pixel_area * slice_thickness与正文公式 \(V = \sum A_k \cdot \Delta z\) 完全对应,单位自动换算为 mm³。
常见误区
误区“SR 报告就是给 DICOM 文件加一段 HTML 或纯文本描述,跟 PDF 差不多。”
正解SR 绝不是一个“文本转储”字段。它的本质是一棵由“概念名-值”组成的内容树,每个节点都有标准编码语义。系统可以检索“所有右肺上叶结节”而不需要做自然语言处理。若把报告当纯文本存,就失去了机器可读性,也违背了 SR 的设计初衷。
为何常见:人们习惯把“报告”理解成一段文字,容易忽略 DICOM 用树状语义结构重新表达信息的深层设计。
误区“SEG 对象里每个器官存一张彩色 PNG,红色是肿瘤、绿色是肺。”
正解SEG 的每个 Segment 是二维 0/1 位掩膜,每像素仅占 1 bit,且各 Segment 分层存储、不混色。渲染时的红绿颜色只是显示层的映射,在数据层并不存在“彩色像素”。这个设计让存储极小、二值语义明确,AI 训练与后处理都方便。
为何常见:人眼看到 PACS 里的彩色叠加图,很自然会以为文件里存的就是那张彩色图,从而高估存储量并误解数据格式。
误区“RTStruct 里的轮廓点 (x, y) 就是图像里的行列号。”
正解RTStruct 的所有轮廓点都是病人坐标系下的三维世界坐标(单位 mm)。要把它变成屏幕上的像素或掩膜,必须结合当前影像的 Image Position Patient 和 Pixel Spacing 做换算。这也是它跨设备保持几何一致性的根基。
为何常见:在图片上“画圈”的直觉让初学者把轮廓点与二维像素坐标混为一谈,忽略了 DICOM 的物理坐标系设计。
误区“都是 DICOM 结构化对象,选一种存就行,反正信息差不多。”
正解三者职责差异巨大:SR 管语义结论(“是什么、多大、什么性质”),SEG 管像素归属(“哪些像素属于哪个结构”),RTStruct 管放疗几何(“靶区轮廓与剂量计划”)。AI 流程中常需要三件套同时存在,并通过 Frame of Reference 和 UID 关联。
为何常见:面对都叫“DICOM 对象”的三种格式,初学者容易只看到相似的外观,而忽略它们在信息粒度、坐标体系与临床用途上的本质不同。
面试题
Q1. DICOM 文件中的 "DICM" 四个字符位于文件的什么区域?
- A.数据元素内容里
- B.128 字节前导区之后← 正确答案
- C.文件尾部的校验区
- D.SOP Class UID 字段中
答案:B。DICM 紧跟在 128 字节前导区之后,作为文件格式的魔法标识。选项 A 混淆了标识与普通数据元素,C 不存在校验区概念,D 中 SOP Class UID 在数据元素内部,与 DICM 位置不同。
Q2. SEG 分割对象中,单个像素的归属信息占用多少位?
- A.1 位← 正确答案
- B.8 位
- C.16 位
- D.24 位
答案:A。SEG 的掩膜是 0/1 二值位平面,每个像素只需 1 位表示“属于/不属于当前 Segment”。8 位对应灰度值、16 位对应 CT 像素,24 位对应彩色标注图,都与 SEG 的设计不符。
Q3. RTStruct 中的轮廓点坐标属于下列哪一套坐标系?
- A.屏幕像素坐标系
- B.影像矩阵的行列索引
- C.病人坐标系,单位毫米← 正确答案
- D.加速器治疗床坐标系
答案:C。RTStruct 轮廓点存储在 Frame of Reference 定义的病人坐标系中,单位为 mm。屏幕像素与行列索引需要换算,治疗床坐标系属于计划执行阶段,均非存储格式本身使用的坐标系。
Q4. 下列哪些 DICOM 对象可以引用某个具体的 Frame of Reference?
- A.SEG 分割对象← 正确答案
- B.RTStruct 放疗结构集← 正确答案
- C.SR 结构化报告
- D.普通 CT 图像← 正确答案
答案:ABD。SEG 与 RTStruct 通过 Frame of Reference UID 与影像绑定空间坐标系,CT 图像自身也属于某个 Frame of Reference。SR 主要关联 Study/Series,通常不直接引用 Frame of Reference 空间坐标系,因此 C 不选。
Q5. SR 内容项的基本组成形式是?
- A.键值对:概念名 + 值← 正确答案
- B.自由文本段落
- C.像素矩阵
- D.坐标点序列
答案:A。SR 的每个内容项都是“概念名-值”对,概念名来自编码表(如 TID 2020 模板),值可以是文本、数值、日期等。自由文本无法结构化,像素矩阵属于图像类,坐标点序列属于 RTStruct 形态。
Q6. 在像素坐标与世界坐标的换算中,需要用到下列哪些参数?
- A.Image Position Patient (0020,0032)← 正确答案
- B.Pixel Spacing (0028,0030)← 正确答案
- C.SOP Class UID
- D.像素的行列索引← 正确答案
答案:ABD。换算公式 \(P_{\text{world}} = P_0 + i\Delta_x + j\Delta_y\) 依赖原点坐标、像素间距和像素行列号。SOP Class UID 只标识对象类型,不参与空间计算,因此 C 不选。
Q7. 下列哪种方式最适合把 AI 分割结果直接交给放疗计划系统编辑?
- A.输出一张 PNG 热图
- B.输出 CSV 像素表格
- C.输出 DICOM RTStruct 轮廓← 正确答案
- D.输出 SR 文本报告
答案:C。放疗计划系统需要可编辑的几何轮廓,RTStruct 以三维坐标点存储靶区轮廓,可直接导入 TPS。PNG 与 CSV 缺乏空间引用,SR 是语义报告而非几何结构。
Q8. 下列关于 SEG 与 RTStruct 存储效率的说法,正确的是?
- A.任意情况下掩膜都比轮廓省空间
- B.轮廓点存储量只取决于 ROI 数量
- C.轮廓密集时 RTStruct 可能比 SEG 更大← 正确答案
- D.SEG 不支持压缩
答案:C。SEG 掩膜大小固定为像素数/8,RTStruct 大小正比于轮廓点数。当轮廓非常密集、点数巨大时,RTStruct 可能超过掩膜体积;反之光滑器官的轮廓更省空间,因此 A 错误,B 忽略了每层点数,D 不准确。
Q9. 下列哪些属于 SR 结构化报告的典型应用价值?
- A.机器可读的语义检索← 正确答案
- B.与历史报告自动对比测量值← 正确答案
- C.提供放疗加速器的剂量计算
- D.跨机构统一报告模板← 正确答案
答案:ABD。SR 的树状语义结构支持自动检索、数值对比与模板统一,这些都是其临床价值。剂量计算依赖 RTStruct 与 RTPlan 的几何与物理信息,SR 不负责此项,因此 C 不选。
Q10. 多中心研究中,SR、SEG 与 CT 影像之间通过什么机制保证可追溯?
- A.文件名后缀约定
- B.SOP Instance UID 与 Frame of Reference 引用链← 正确答案
- C.数据存储的物理路径
- D.患者姓名与出生日期匹配
答案:B。DICOM 通过 SOP Instance UID、Series UID、Study UID 及 Frame of Reference UID 构成可机器校验的引用链。文件名与物理路径无标准语义,姓名出生日期匹配存在重名风险且非 DICOM 标准机制。