DICOM3.0医学文件的解析
最近导师一直让做智慧医疗的一个项目,这里面涉及到DICOM格式的文件处理,在这里分享一下自己学到的关于DCM文件的一些内容。
1.DICOM
DICOM(DigitalImaging andCommunications inMedicine)是指医疗数字影像传输协定,是用于医学影像处理、储存、打印、传输的一组通用的标准协定。它包含了文件格式的定义以及网络通信协议。DICOM是以TCP/IP为基础的应用协定,并以TCP/IP联系各个系统。两个能接受DICOM格式的医疗仪器间,可通过DICOM格式的文件,来接收与交换影像及病人资料。
目前,DICOM被广泛应用于放射医疗,心血管成像以及放射诊疗诊断设备(X射线,CT,核磁共振,超声等),并且在眼科和牙科等其它医学领域得到越来越深入广泛的应用。
目前采用的标准是DICOM3.0,每一张图像中都携带着大量的信息,这些信息具体可以分为以下四类:
- (a)Patient
- (b)Study
- (c)Series
- (d)Image
每一个DICOM Tag都是由两个十六进制数的组合来确定的,分别为Group和Element。如(0010,0010)这个Tag表示的是Patient’s Name,它存储着这张DICOM图像的患者姓名。
2.DICOM存储格式
DICOM文件的整体结构如下表所示,先是128字节的导言部分(没有实际信息),接着是四个字节组成的"DICM"字符串,然后是若干DataElement元素依次排列直至文件结束。
导言 |
"DICM" |
DataElement |
DataElement |
... |
DataElement |
---|---|---|---|---|---|
128 Byte |
4 Byte |
n Byte |
n Byte |
|
n Byte |
2.1 DataElement的三种结构
DataElement是存储文件信息的主体,DataElement的总体结构如下表所示:
Tag |
VR(值表示法) |
Len(数据长度) |
数据值(内容) |
---|---|---|---|
4 Byte |
2 Byte |
2 Byte |
Len Byte |
Tag由2 Byte的组号(group)和2 Byte的元素号(element)组成,VR是DICOM特有的值表示法,关于值表示法的解释见下文
按照VR的类型以及是否显示VR,DataElement又分为三种具体的结构。
- 显示VR:VR为OB OW OF UT SQ UN的元素结构
结构 |
组号 |
元素号 |
VR |
预留 |
值长度 |
数据元素值 |
---|---|---|---|---|---|---|
字节数 |
2 |
2 |
2 |
2(0x00,0x00) |
4 |
由值长度确定 |
- 显示VR:VR为普通类型时元素结构(少了预留那一行)
结构 |
组号 |
元素号 |
VR |
值长度 |
数据元素值 |
---|---|---|---|---|---|
字节数 |
2 |
2 |
2 |
4 |
由值长度确定 |
- 隐式VR
结构 |
组号 |
元素号 |
值长度 |
数据元素值 |
---|---|---|---|---|
字节数 |
2 |
2 |
4 |
由值长度确定 |
2.2 DataElement的Tag
DataElement的Tag用于标识Element的数据内容,比如病人信息、图像的格式等。
Tag总共有2000多个。
常用的主要组号:0002组描述设备通讯,0008组描述特征参数,0010组描述患者信息,0028组描述图像信息参数。
Dicom文件数据中所有dataElement从前到后
2.2.1 按tag格式又可简单分段
- 文件元Tag(组号+0000)
不受传输语法影响,总是以显示VR方式表示,用于定义了传输语法;
文件元Tag的dataElement,并没有多大的意义,它的值长度是整个组所有DataElement的字节长度,一个Dicom中可以只有一个文件元Tag,也可以有多个文件元Tag。
- 普通Tag
除了文件元Tag和像素Tag,其余的都是普通Tag数据。包括:图像宽,高,数据传输格式,病人姓名,病人生日,病历医院,病历科室,病情的描述等等数据;
- 像素Tag(7fe0,0010)
表示DataElement存储的是病历的图像数据。
2.2.2 按Tag展示信息的类别
- Patient Tag
Group |
Element |
Tag Description |
中文解释 |
VR |
---|---|---|---|---|
0010 |
0010 |
Patient’s Name |
患者姓名 |
PN |
0010 |
0020 |
Patient 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 |
Element |
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 complement. |
像素数据的表现类型:这是一个枚举值,分别为十六进制数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 DataElement的VR
VR(Value Representation)值表示法是DICOM文件中特有的一种数据类型表示方式,规定了不同数据类型的含义及存储格,共有27种VR。在隐式VR的结构中会根据元素标识进行判断。Tag和VR是有对应关系的,每一种Tag其实是有一个固定的VR类型。
2.3.1 27种VR的含义及数据长度
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未知 |
字节的字符串,其中内容的编码方式是未知的 |
|
|
2.4 DataElement的数据长度
数据长度用两个字节存储了数据元素值的长度,所有DICOM数据元素都应该为偶数长度,若为奇数,追加空格或空NULL。当数据长度为0xFFFFFFFF时,数据一直到截止符为止。
现有的解析库
- 基于C++的DCMTK
- 基于Java的dcm4che
- 基于python的pydicom
- 基于C#的fo-dicom
- 基于JS的cornerstone
通过在工程中引入它们可以避免软件开发人员去进行底层的解析工作,可为项目开发提高效率。