转自:DICOM命令集和数据集解析 - 微笑的艾米 - 博客园
摘 要:本文通过分析一个典型的DICOM消息,详细地解析了DICOM命令集和数据集的构成方式和其含义。并在此基础上,提出了一种实现DICOM命令集和数据集解析的实施方案,并对该种方案的设计思路和具体实现方法进行了详细的阐述。
关键词:医学数字成像及通信标准,信息对象定义,服务对象对
1. 前言
DICOM(Digital Imaging and Communications in Medicine)是医疗设备的国际标准通信协议,它为在不同医疗设备之间对医学图像等数字信息进行各种命令操作定义了统一的规范。现在,越来越多的医疗设备生产厂家开始施行并支持DICOM标准。现在广泛使用的版本是DICOM3.0。
在本文中,利用一个实例来分析DICOM协议是如何利用DICOM命令集和数据集在不同医疗设备之间进行图像存储操作的,并在此基础上,提出了一个解析DICOM命令集和数据集的实现方案。
2. 信息对象定义
DICOM是一个数字医学图像的网络通讯接口标准。基于此,将现实世界中的实体进行抽象数据化是制定标准的一个重要步骤。DICOM标准描述了许多信息对象类(Information Object Class,简称IOC)。这些信息对象类为现实世界中能够以数字医学图像这种方式通讯的实体提供了一个面向对象的抽象定义,这个定义称作信息对象定义(Information Object Definition,简称IOD)。一个信息对象定义(IOD)是由若干包含相关信息的信息实体组成。每一个信息实体对应着DICOM应用模型中的现实世界实体(如患者、图像等)的一个数据抽象。每个信息实体是由若干属性组成的,属性是现实世界实体性质(如患者的姓名、年龄、图像的成像日期等)的抽象。在DICOM标准中,每个属性用一个数据元素来描述,而一个信息实体的相关属性的集合则用数据集来描述。
3. 服务对象对
面向对象的设计不仅描述了对象本身的属性,同时还说明了怎样处理这些对象的方法。DICOM标准就是利用这个概念,定义了诸如存储图像、获取病人信息之类的服务。由于是面向对象的设计,故服务又被称作服务类。一个服务类由若干个相关的服务对象类(Service Object Pair Class,简称SOP Class)组成。SOP类是DICOM标准中定义的基本功能单位。对于一个特定的SOP类来说,一台装置可能扮演以下两个角色:一:服务类提供者(Service Class Provider,简称SCP),扮演这个角色的机器提供SOP类的服务,它相当于客户/服务器模型中的服务器(Server);二:服务类使用者(Service Class User,简称SCU),扮演这个角色的装置使用SOP类的服务,它相当于客户/服务器模型中的客户。例如一台成像装置要打印一幅图像,在这种情况下,该成像装置为与打印相关的SOP类的SCU,打印机为SCP。一个SOP类的一次具体实现称作服务对象对实例,存储图像、获取病人信息等操作就是通过SOP实例实现的。
图1形象地描述了SOP类及其实例的关系。
动词:Store 服务(DIMSE)
名词:MRI Image 信息对象定义IOD
一般句子:Store a MRI image SOP类
特指句子:Store this MRI image SOP实例
图1 SOP类与实例
4. DICOM消息
一个SOP类被定义为一组特定的服务与一个相关的信息对象(IOD)的结合,一个SOP类的具体实现是通过DICOM消息的交互完成的。
在DICOM标准中,DICOM消息由命令集和数据集组成,其中数据集描述现实世界信息对象的一个实例,而命令集则描述对这个信息对象实例做何种操作。命令集由若干个命令元素组成,每个命令元素由标签域、值长度域和值域组成。而数据集由若干个数据元素组成,每个数据元素由标签域、数据表示类型域(可选域)、值长度域和值域组成。
无论是在命令集还是数据集中,标签都唯一的标识一个命令或者数据元素,元素必须按标签的升序依次排列,且每个元素一般最多只能出现一次(嵌套除外),元素标签由一对组号和元素号组成,两者均为16位无符号整数;值长度域是以字节数表明值域的长度,其值必须为偶数;值域包含了有关操作命令的属性值(针对命令元素而言)或者现实世界信息对象实例的属性的具体值(针对数据元素而言),其长度是可变的,但是不能超过值长度域所规定的长度。
在数据集中,数据表示类型域是一个可选项,说明值域的类型。当元素中包含该域时,称作显式VR(Value Representation),否则称作隐式VR。
下面的表格描述了一个典型DICOM消息,其中数据集描述了一个图像的具体实例,而命令集的含义则是请求对该图像实例做存储(C-STORE)服务,很显然,这是一个从SCU发往SCP的存储(C-STORE)请求(REQUEST)消息。其中组号为0000的元素为命令元素,其它为数据元素。如表1所示。
表1 C-Store服务的DICOM请求消息
组 | 元素 | 长度 | 值 | 意义 | 说明 |
0000 | 0000 | 0004 0000 | 0056 0000 | 从本字段的结束至下一组开始的偶数字节 | |
0000 | 0001 | 0004 0000 | 01A0 0010 | 从本字段的结束至报文结束的偶数字节 | |
0000 | 0010 | 000C 0000 | 4341 2D52 454E 414D 3120 302E | “ACR-NEMA 1.0” | 识别码 |
0000 | 0100 | 0002 0000 | 0001 | 0001H | 命令字段=C-Store-Request |
0000 | 0110 | 0002 0000 | 123A | 123A | 由成像装置生成的报文识别号 |
0000 | 0200 | 0004 0000 | 4344 3148 | “DCH1” | 发送者逻辑地址 |
0000 | 0300 | 0004 0000 | 4341 3148 | “ACH1” | 接收者逻辑地址 |
0000 | 0800 | 0002 0000 | 0000 | 0000H | 数据类型=图像 |
0008 | 0000 | 0004 0000 | 0080 0000 | ||
0008 | 0001 | 0004 0000 | 013E 0100 | ||
0008 | 0010 | 000C 0000 | 4341 2D52 454E 414D 3120 302E | “ACR-NEMA 1.0” | 识别码 |
0008 | 0020 | 000A 0000 | 3032 3230 312E 2E31 3532 | “2002.11.25” | 分项检查日期 |
0008 | 0030 | 0008 0000 | 3231 303A 3A35 | “12:05:59” | 分项检查时间 |
0008 | 0040 | 0002 0000 | 0000 | 0000H | 数据集类型=图像 |
0008 | 0060 | 0002 0000 | 5254 | “DR” | 成像模式 |
0008 | 0070 | 0004 0000 | 4241 4443 | “ABCD” | 制造商 |
0008 | 0080 | 000E 0000 | 454D 4352 2059 4F48 5053 5449 4C41 | “Mercy Hospital” | 医院识别号 |
0008 | 0090 | 0000 0000 | 检查医师未知 | ||
0010 | 0000 | 0004 0000 | 0042 0000 | 组长度 | |
0010 | 0010 | 000E 0000 | 4F4A 454E 2C53 4A20 4D49 4320 202E | “JONES, Jim C. “ | 患者姓名 |
0010 | 0020 | 0008 0000 | 3031 2D32 3033 2034 | “102-304 “ | 患者识别号 |
0010 | 0030 | 000A 0000 | 3931 3632 312E 2E31 3532 | “1926.11.25” | 患者出生日期 |
0010 | 0040 | 0002 0000 | 204D | “M “ | 患者性别=男 |
0018 | 0000 | 0004 0000 | 0000 0000 | 组长度为零—无其它元素传送 | |
0020 | 0000 | 0004 0000 | 0018 0000 | 组长度 | |
0020 | 0010 | 0004 0000 | 3932 3330 | “2903” | 分项检查号 |
0020 | 0020 | 0004 0000 | 5C52 2046 | “R/F” | 患者取向 |
0028 | 0000 | 0004 0000 | 002C 0000 | 组长度 | |
0028 | 0010 | 0002 0000 | 0400 | 0400H | 行数=1024 |
0028 | 0011 | 0002 0000 | 0400 | 0400H | 列数=1024 |
0028 | 0030 | 0006 0000 | 2E20 5C33 332E | “ .3\.3” | 像素的实际尺寸=0.3*0.3像素 |
0028 | 0100 | 0002 0000 | 0008 | 008H | 每个像素指定的位数=8 |
7FE0 | 0000 | 0004 0010 | 0008 0010 | 组长度 | |
7FE0 | 0010 | 0000 0000 | *******…***** | 像素数据(524,288字节) |
5. 编码
在实际应用中,利用两个基类CElement和CElementSet分别表示数据元素(或者命令元素)以及这些元素集合的抽象,并且描述各自的基本特征属性。利用这两个基本类可以派生出其它类。例如,我们利用类CElementSet的一个派生类DcmFile来描述一个DICOM图像文件,在这个类中,我们实现了两个主要方法loadDcmFile()和writeToDcmFile(),它们的含义分别是从指定的路径下读取DICOM图像文件和把数据集中的所有数据元素还原成指定路径下的DICOM图像文件;同样,我们利用类CElementSet的另外一个派生类CommandSet来描述一个命令集,它包含两个主要方法getCmdValue()和getDataType(),其含义分别是获取此命令集描述的服务和消息类型以及获取此命令集的操作对象(数据集)所描述的信息实体类型。
在解析一个命令集(或者数据集,例如一个DICOM图像文件)时,可以以标签为标识,读出感兴趣的命令元素(或者数据元素),并将该命令元素(数据元素)作为类CCommandElement(或者类CDataElement,均为类 CElement的派生类)的一个实例来处理。
例如在解析表1的DICOM消息时,首先应该读取它的命令集,即组号为0000的元素。读取的每个命令元素作为类CCommandElement (类CElement的派生类)的一个实例存在,而读取的所有命令元素的集合作为类CommandSet的一个实例存在。然后,再利用CommandSet提供的方法getCmdValue()和getDataType()获取此命令集描述的服务和消息类型以及此命令集的操作对象(即数据集)所描述的信息实体类型。在本例中,根据DICOM标准,由于命令集中标签为[0000,0010]的值域的具体值是0001H,所以,该命令集所描述的是C-STORE服务请求,而标签为[0000,0080]的值域的具体值是0000H,因此,该命令集的操作对象(即数据集)的类型是图像。综合起来,这个DICOM消息的含义就是存储封装在数据集中的图像文件。
解析完命令集后,根据解析结果,再读取同一个DICOM消息中的数据集,即组号不是0000的元素,这里,将每个读取的数据元素作为类CDataElement(类CElement的派生类)的一个实例存在,而读取的所有数据元素的集合作为类DcmFile的一个实例存在。然后,调用类DcmFile所提供的writeToDcmFile()方法,将这些数据元素还原成图像文件的形式并加以存储。最后,根据命令执行的成功与失败,构造一个响应信息,返回给服务请求端。
6.结束语
DICOM标准是第一个广为接受的医疗设备间通讯的国际标准,它作为一个计算机和医学相关联的纽带起着非常重要的作用。
本文通过分析一个典型的DICOM消息,详细地解析了DICOM命令集和数据集的构成方式和其含义。并在此基础上,提出了一种实现DICOM命令集和数据集解析的实施方案,并对该种方案的设计思路和具体实现方法进行了详细的阐述。实现DICOM命令集和数据集的解析为远程医疗应用提供了基础。
参考文献
1. National Electrical Manufacturer Association. Digital Imaging and Communication in Medicine(DICOM)[S],1999
2. 贾克斌,沈波. 实现医学影像存档和传输系统中的若干关键技术[J]. 中国图像图形学报,2000,5(A)(7):539-544