【智慧医疗】DICOM学习指南
一、什么是DICOM?
DICOM 是 Digital Imaging and Communications in Medicine (DICOM) 的英文缩写, 即医学数字成像和通信标准。该标准主要由 ACR(美国放射学会) 和 NEMA(国家电子制造商协会) 等机构共同制定, 用于规范数字化医学影像的数据传送、显示与存储过程。 DICOM 标准通过详细规范了图像及其相关信息的数据格式与交换机制, 为医疗设备提供了统一的数据接口以实现图像数据的接收与处理。
二、DICOM文件格式详解
DICOM 文件是一种标记化的图像数据文件,在医疗成像系统中扮演着关键角色。它不仅包含原始的影像数据本身,并且还附带与之相关的辅助信息集合。这种特殊设计使得 DICOM 格式的文件能够实现两个通过 DICOM 格式交换患者数据和影像信息的不同实体之间的通信。从非 technically专业的角度来看,在这种系统架构下 DICOM 文件被用来存储患者的医学影像资料及其相关元数据(如设备参数、采集时间等)。这些记录既包含了原始影像数据本身的信息内容(如解剖学特征),也记录了与患者直接相关的元数据(如姓名、性别、年龄等),即 PHI(protected health information)。如图所示,在实际应用中我们通常会看到具有.dcm扩展名的影像 files 实际上是以二进制形式保存的.
三、数据结构
DICOM数据在医疗影像领域中具有重要地位,在一次诊断周期内每个.dcm文件都完整记录了所有相关信息(包括病患资料和影像数据)。采用解析方法读取.dcm文件能够系统性地提取所需详细信息。
DICOM文件结构


打开任意一个.dcm文件,使用16进制打开,可以看到如下结构:

导言
导言部分128字节,描述文件的相关导言信息,可以直接跳过。
前缀
该 dicm 标识符作为一个 4 字节的二进制数据字段,在接收端被解析时会自动进行处理和转换以获取相应的数据内容
数据元素
在前缀后面就是真正的数据元素来。
基于数据元素,在解析过程中,默认会以键值对(key-value)的形式处理这些信息。其中每个tag都对应于dicom系统中预先定义好的字段集合,在实际操作中我们可以通过关注特定的tag来聚焦于所需的信息。整个dicom系统的总共有至少2000个不同的字段。
好的, 现在开始学习DICOM的基本数据结构。对于新手来说, 在深入理解后可以通过实践来分析这些结构并体验这些步骤. 在实际工作中或软件开发中通常依赖于现成的公开源代码库进行操作. 例如, 在C++领域有DCMTK, 在Java领域有dcm4che, 在Python领域则有pydicom等工具.
作为 DICOM 文件的核心组成成分,
这些 DICOM 数据 元素遵循特定的排列规则,
每个 数据 元素 的 最基础 单位 是 数据 标签(Tag),
依据 TAG 编号从低到高进行排序,
即一个 数据 元表示一个 TAG 。
数据元主要由4个部分组成:
- TAG编号 由4个字节构成两部分:一部分为2字节数值用于标识设备通讯信息中的分组标识符(如X),另一部分则为特征参数编码(如Y)。在提取所需DICOM文件的相关数据时,则依据该(TAG)进行获取。
值表示 (VR, value representation):占用两个字节的字符空间以存储该数据元信息所需的数据类型,在此过程中会包含LO(长字符串)、IS(整型字符串)、DA(日期)等27种基本类型中的任意一种或多种组合形式。
- 值长度 (value length):存储描述该项信息的数据长度
- 值域 (value):存储描述该项信息的数据值
其中数据元信息可以根据信息的不同,分为4类: - Patient - Study - Series - Image
可以理解为一个患者(patient )可以做多次检查(study ),一次检查包含多个检查部位(series ),而每个检查部位都有一张或多张相应的影像图像(image )。
DICOM-Tag说明
(由两个16位无符号整数组成的分组号和元素号);共有大约2000种不同的tag。
其中前两个字节表示组号(如0x08),后两个字节表示元素号(如0x18)。我们从dicom数据中提取所需的信息时,会根据每个dataElement的tag信息来确定是否需要读取该数据块。
例如,在一个dicom文件中:
tag = 0x8818 (其中前两个字节是组别标识符:$U'88';后两个字节是个别体标识符:$U'18')这样的结构帮助我们快速定位所需的数据块。
1、患者信息

Patient Tag
| Group(组号) | Element(元素号) | Tag Description | 中文解释 | VR |
|---|---|---|---|---|
| 0010 | 0010 | Patient’s Name | 患者姓名 | PN |
| 0010 | 0020 | P1atient | ID患者ID | LO |
| 0010 | 0030 | Patient’s Birth Date | 患者出生日期 | DA |
| 0010 | 0032 | Patient’s Birth Time | 患者出生时间 | TM |
| 0010 | 0040 | Patient’s Sex | 患者性别 | CS |
| 0010 | 1030 | Patient’s Weight | 患者体重 | DS |
| 0010 | 21C0 | Pregnancy Status | 怀孕状态 | US |
Study Tag
| Group | Elemen | Tag Description | 中文解释 | VR |
|---|---|---|---|---|
| 0008 | 0050 | Accession Number:A RIS generated number that identifies the order for the Study. | 检查号:RIS的生成序号,用以标识做检查的次序. | SH |
| 0020 | 0010 | Study ID | 检查ID. | SH |
| 0020 | 000D | Study Instance UID: Unique identifier for the Study. | 检查实例号:唯一标记不同检查的号码. | UI |
| 0008 | 0020 | Study Date: Date the Study started. | 检查日期:检查开始的日期. | DA |
| 0008 | 0030 | Study Time:Time the Study started. | 检查时间:检查开始的时间. | TM |
| 0008 | 0061 | Modalities in Study | 一个检查中含有的不同检查类型. | CS |
| 0008 | 0015 | Body Part Examined | 检查的部位. | CS |
| 0008 | 1030 | Study Description | 检查的描述. | LO |
| 0010 | 1010 | Patient’s Age | 做检查时刻的患者年龄,而不是此刻患者的真实年龄. | AS |
Series Tag
| Group | Element | Tag Description | 中文解释 | VR |
|---|---|---|---|---|
| 0020 | 0011 | Series Number:A number that identifies this Series. | 序列号:识别不同检查的号. | IS |
| 0020 | 000E | Series Instance UID:Unique identifier for the Series. | 序列实例号:唯一标记不同序列的号码. | UI |
| 0008 | 0060 | Modality | 检查模态(MRI/CT/CR/DR) | CS |
| 0008 | 103E | Series Description | 检查描述和说明 | LO |
| 0008 | 0021 | Series Date | 检查日期 | DA |
| 0008 | 0031 | Series Time | 检查时间 | TM |
| 0020 | 0032 | Image Position (Patient):The x, y and z coordinates of the upper left hand corner of the image, in mm. | 图像位置:图像的左上角在空间坐标系中的x,y,z坐标,单位是毫米.如果在检查中,则指该序列中第一张影像左上角的坐标. | DS |
| 0020 | 0037 | Image Orientation (Patient):The direction cosines of the first row and the first column with respect to the patient. | 图像方位 | DS |
| 0018 | 0050 | Slice Thickness:Nominal slice thickness, in mm. | 层厚. | DS |
| 0018 | 0088 | Spacing Between Slices | 层与层之间的间距,单位为mm | DS |
| 0020 | 1041 | Slice Location:Relative position of exposure expressed in mm. | 实际的相对位置,单位为mm. | DS |
| 0018 | 0023 | MR Acquisition | 收购者 | CS |
| 0018 | 0015 | Body Part Examined | 身体部位. | CS |
Image Tag
| Group | Element | Tag Description | 中文解释 | VR |
|---|---|---|---|---|
| 0008 | 0008 | Image Type:Image identification characteristics. | 。 | CS |
| 0008 | 0018 | SOP Instance UID | SOP实例 | UID. |
| 0008 | 0023 | Content Date:The date the image pixel data creation started. | 影像拍摄的日期. | DA |
| 0008 | 0033 | Content Time | 影像拍摄的时间. | TM |
| 0020 | 0013 | Image/Instance Number:A number that identifies this image. | 图像码:辨识图像的号码. | IS |
| 0028 | 0002 | Samples Per Pixel:Number of samples (planes) in this image. | 图像上的采样率. | US |
| 0028 | 0004 | Photometric Interpretation:Specifies the intended interpretation of the pixel data. | 光度计的解释,对于CT图像,用两个枚举值MONOCHROME1,MONOCHROME2.用来判断图像是否是彩色的,MONOCHROME1/2是灰度图, RGB则是真彩色图,还有其他. | CS |
| 0028 | 0010 | Rows: Number of rows in the image. | 图像的总行数,行分辨率. | US |
| 0028 | 0011 | Columns: Number of columns in the image. | 图像的总列数,列分辨率. | US |
| 0028 | 0030 | Pixel Spacing:Physical distance in the patient between the center of each pixel. | 像素间距.像素中心之间的物理间距. | DS |
| 0028 | 0100 | Bits Allocated:Number of bits allocated for each pixel sample. Each sample shall have the same number of bits allocated. | 分配的位数:存储每一个像素值时分配的位数,每一个样本应该拥有相同的这个值. | US |
| 0028 | 0101 | Bits Stored:Number of bits stored for each pixel sample. Each sample shall have the same number of bits stored | 存储的位数:有12到16列举值.存储每一个像素用的位数.每一个样本应该有相同值. | US |
| 0028 | 0102 | High Bit:Most significant bit for pixel sample data. Each sample shall have the same high bit. | 高位. | US |
| 0028 | 0103 | Pixel Representation:Data representation of the pixel samples. Each sample shall have the same pixel representation.Enum: 0000H=unsigned integer,0001H=2’s omplement. | 像素数据的表现类型:这是一个枚举值,分别为十六进制数0000和0001.0000H = 无符号整数,0001H = 2的补码. | US |
| 0028 | 1050 | Window Center | 窗位. | DS |
| 0028 | 1051 | Window Width | 窗宽. | DS |
| 0028 | 1052 | Rescale Intercept:The value b in relationship between stored values (SV) and the output units.Output units = m*SV + b.Required if Modality LUT Sequence (0028, 0030) is not present. | 截距:如果表明不同模态的LUT颜色对应表不存在时,则使用方程Units = m*SV + b,计算真实的像素值到呈现像素值。其中这个值为表达式中的b。 | DS |
| 0028 | 1053 | Rescale Slope:m in the equation specified by Rescale Intercept (0028,1052).Required if Rescale Intercept is present. | 斜率.这个值为表达式中的m。 | DS |
| 0028 | 1054 | Rescale Type:Specifies the output units of Rescale Slope (0028,1053) and Rescale Intercept (0028,1052).Enum: US=Unspecified Requried if Photometric Interpretation is MONOCHROME2, and Bits Stored is greater than 1.This specifies an identity Modality LUT transformation. | 输出值的单位.这是一个枚举值, | LO |
2、设备医院相关信息

3、study信息(整个SERIES一样)

4、图像信息(除注明的,整个SERIES相同)

5、CT 设备信息(整个SERIES相同)

6、MR设备相关tag(整个SERIES相同)

DICOM-VR数据类型说明

DICOM 标准支持的数据集

支持的设备类型

DICOM-VR说明
如何理解VR这一概念呢?它本质上是一种分类表示工具,在描述数据元素所属的类别时具有独特性。与Java中的String、Long等基本类型相仿,VR提供了多种数据类型以适应不同的需求。具体来说,在VR中我们有LO(长字符串)、IS(整字符串)等27种类型供选择。
此外,在VR中每个数据项通常由两个单一字符组成。
1.显示VR:VR为OB OW OF UT SQ UN的元素结构
| 组号 | 元素号 | VR | 预留 | 值长度 | 数据元素值 |
|---|---|---|---|---|---|
| 2 | 2 | 2 | 2(0x00,0x00) | 4 | 由数据长度决定 |
组号和元素号组成tag,上面的数组表示给类型占有的字节长度
2.显示VR:VR为普通类型时元素结构(少了预留那一行)
| 组号 | 元素号 | VR | 值长度 | 数据元素值 |
|---|---|---|---|---|
| 2 | 2 | 2 | 4 | 由数据长度决定 |
3.隐式VR时元素结构(也就是dataElement中没有VR这个值)
| 组号 | 元素号 | 值长度 | 数据元素值 |
|---|---|---|---|
| 2 | 2 | 4 | 由数据长度决定 |
VR是DICOM标准中用来描述数据类型的,总共有27个值。简单分类如下:
| VR | 含义 | 允许的字符 | 数据长度 |
|---|---|---|---|
| CS - Code String | 代码字符串 开头结尾可以有没有意义的空格的字符串,比如“CD123_4” | 大写字母,0-9,空格以及下划线字符 | 最多 16 个字符 |
| SH - Short String | 短字符串 短字符串,比如:电话号码,ID等 | 。 | 最多 16 个字符 |
| LO - Long String | 长字符串 一个字符串,可能在开头、结尾填有空 格。比如“Introduction to DICOM” | 。 | 最多 64 个字符 |
| ST - Short Text | 短文本 可能包含一个或多个段落的字符串 | 。 | 最多 1024 个字符 |
| LT - Long Text | 短文本 可能包含一个或多个锻炼的字符串,与LO相同,但可以更长 | 。 | 最多 10240 个字符 |
| UT | Unlimited Text | 无限制文本 包含一个或多个段落的字符串,与LT 类似 | 最多(2的32次方–2)个字符 |
| AE - Application Entity | 应用实体 标识一个设备的名称的字符串,开头和 结尾可以有无意义的字符。比如“MyPC01” | 。 | 最多 16 个字符 |
| PN - Person Name | 病人姓名 有插入符号()作为姓名分隔符的病人姓名。比如“SMITHJOHN” “Morrison- JonesSusan^^Ph.D, Chief Executive Officer” | 。 | 最多 64 个字符 |
| UI - Unique Identifier (UID) | 唯一标识符 一个用作唯一标识各类项目的包含UID 的字符串。比如“1.2.840.10008.1.1” 0-9 和半角句号(.) | 。 | 最多64 个字符 |
| DA - Date | 日期 格式为 YYYYMMDD 的字符串;YYYY 代表年;MM 代表月;DD 代表日。比如“20050822”表示 2005 年 8 月22 日 | 0-9 | 8个字符 |
| TM - Time | 时间 格式为 HHMMSS 的字符串。FRAC; HH 表示小时(范围“00”-“23”); MM 表示分钟(范围“00”-“59”); 而 FRAC 包含秒的小数部分,即百万分 之一秒。比如“183200.00” 表示下午 6:32 0-9 和半角句号(.) | 最多 16 个字符 | |
| DT - Date Time | 日期时间 格式为 YYYYMMDDHHMMSS. FFFFFF,串联的日期时间字符串。字符串的各部分从左至右是:年YYYY;月 MM;日 DD;小时 HH;分钟 MM;秒 SS;秒的小数FFFFFF。比如20050812183000.00”表示2005 年 8 月 12 日下午 18 点 30分 00 秒 0-9,加号,减号和半角句号 最多 | 。 | 26 个字符 |
| AS - Age String | 年龄字符串 符合以下格式的字符串:nnnD,nnnW, nnnM, nnnY;其中nnn 对于 D 来说表示天数,对于W来说表示周数,对于M 来说表示月数,对于 Y 来说表示岁数。 比如“018M”表示他的年龄是 18 个月 | 0–9, D,W,M, Y | 4 个字符 |
| IS - Integer String | 整型字符串 表示一个整型数字的字符串。比如“-1234567” 0-9,加号(+),减号(-) | 。 | 最多 12 个字符 |
| DS - Decimal String | 小数字符串 表示定点小数和浮点小数。 比如“12345.67”,“-5.0e3” 0-9,加号(+),减号(-), 最多 16个字符 E,e和半角句号(.) | 。 | 最多 16 个字符 |
| SS - Signed Short | 有符号短型 符号型二进制整数,长度 16 比特 | 。 | 2 个字符 |
| US - Unsigned Short | 无符号短型 无符号二进制整数,长度 16 比特 | 。 | 2 个字符 |
| SL - Signed Long | 有符号长型 有符号二进制整数 | 。 | 4 个字符 |
| UL - Unsigned Long | 无符号长型 无符号二进制整数,长度 32 比特 | 。 | 4 个字符 |
| AT - Attribute Tag | 属性标签 16 比特无符号整数的有序对,数据元素的标签 | 。 | 4 个字符 |
| FL - Floating Single | 单精度浮点 单精度二进制浮点数字 | 。 | 4 个字符 |
| FD - Floating Point Double | 双精度二进制浮点数字 双精度二进制浮点数字 | 。 | 8 个字符 |
| OB - Other Byte String | 其他字节字符串 字节的字符串(“其他”表示没有在VR中定义的内容) | 。 | 。 |
| OW - Other Word String | 其他单词字符串 16 比特(2 字节)单词字符串 | 。 | 。 |
| OF - Other Float String | 其他浮点字符串 32 比特(4 个字节)浮点单词字符串 | 。 | 。 |
| SQ - Sequence Items | 条目序列 条目的序列 | 。 | 。 |
| UN - Unknown | 未知 字节的字符串,其中内容的编码方式是未知的 | 。 | . |
DICOM-VL说明
数据类型:在某些情况下(如存储空间限制),2字节UInt16可能会被替换为4字节UInt32。
数据长度:所有DICOM数据元素应当具备偶数长度特性;若遇到奇数长度的情况,则可在末尾追加一个空格或一个空NULL以确保VL值的准确性。
数据类型:所有DICOM数据元素应当具备偶数长度特性;若遇到奇数长度的情况,则可在末尾追加一个空格或一个空NULL以确保VL值的准确性。
DICOM-VF说明
值在dataElement中表现为数据的形式。例如用户名、年龄、性别等数据。需要注意的是,在对应的VF中虽然存储了图像字节的数据但仍然无法显示出来。
四、参考资料
官方文档
1、DICOM
DICOM相关框架
Understanding DICOM Directory: Comprehensive Guide by Saravanan Subramanian
问题解决
通过源码编译实现对最新版本DCM4CHE的支持,并解决了部分依赖项无法下载的问题
该软件包在Maven项目管理中发现组件安装失败
成熟的医学影像"调窗"(window-leveling)算法详解
DICOM测试文件下载(可用于开发测试)
Obtain example videos and medical imaging data sets from the website at here.
2、DICOM Library - Anonymize, Share, View DICOM files ONLINE
3、[GitHub - SaravananSubramanian/dicom: 这个存储库包含了我在个人博客上发表的所有DICOM相关文章中使用的代码(其中包括了Java示例)](https://github.com/SaravananSubramanian/dicom "GitHub - SaravananSubramanian/dicom: 这个存储库包含了我在个人博客上发表的所有DICOM相关文章中使用的代码 其中包括了Java示例)
他整理了几个国际上流行的DICOM文件下载网站,并将其分享到自己的技术分享空间中。如需访问,请参考原文章链接:[收集了一些国外 DICOM 文件下载网站_伍心的专栏-博客_dicom文件 download]( "收集了一些国外 DICOM 文件下载网站_伍心的专栏-博客_dicom文件 download")
查看DICOM文件相关软件
1、Sante DICOM Viewer Mac | Download
2、https://www.dicomgo.com/dgv/viewer#/view
3、[DICOM file download on C++ tutor's personal knowledge base on Zhihu]( "DICOM file download on C++ tutor's personal knowledge base on Zhihu")
网上文章对DICOM经验总结
医学影像开发知识基础 - 知乎
第二步,请访问个人资料库:Dicom资源分享与详细解析(知乎)
3、[wenzhi老师的个人技术分享-DICOM数据深度分析]( "wzhnti shifanye diandianfenshiniyuanzhan)
深入解析 dicom 文件中的值类型 VR 原则及其应用
DICOM数据解析工具 于 assassinx的个人博客
DICOM 文件解析 [文章标题]
https://wenku.baidu.com/view/d07feef002d276a200292eb8.html 在百度文库上提供关于 DICOM 数据的详细解读与应用指南
9、<>
深入探讨DCM4CHE在多帧图像处理中的应用与优化策略
11、[[医疗信息化][DICOM教程]DICOM Tutorials 教程目录_浩秦的博客-博客]( "医疗信息化DICOM教程DICOM Tutorials 教程目录_浩秦的博客-博客")
喵星之旅·激动人心的系列——从数字化卡片(DCM)文件转换为JPEG图片!这是一个通过Java语言开发出的一种高效的方法
DCM4CHE在处理压缩的DICOM文件方面具有专长,并提供详细的技术解析 -灰信网(软件开发博客聚合)
该文章系统阐述了数字医学成像与通信领域的核心地位,在探讨其发展时特别强调了图像质量的关键影响因素以及影像设备选型时应重点关注的内容,并指出标准化操作流程对于提升诊断准确性的重要性。同时文章还展望了未来技术融合的趋势以及其对临床实践所产生的深远影响
基于Java语言开发的dcm4che开源项目在解析dicom医学影像数据中的应用
16、<>
DICOM:坚定的步伐迈向未来——zssure-博客
18、[医学影像学中的 DICOM 格式解读 - 控制性 oscillation 焦虑症 - 个人博客平台](https://www.cnblogs.com/XDU-Lakers/p/9863114.html "医学影像学中的 DICOM 格式解读 - 控制性 oscillation 焦虑症 - 个人博客平台)
