DICOM命令集和数据集解析

转载 2006年05月26日 12:50:00
   王晓楠
(东软数字医疗系统股份有限公司,辽宁 沈阳 110179)
摘要:本文通过分析一个典型的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

相关文章推荐

收集了一些国外 DICOM 文件下载网站

http://www.chameleon-software.de/en/beispielvideos.php

用H5 Canvas 绘画箭头

最近做一个项目,需要最近绘画一个箭头,其实用Canvas绘画很简单,但是箭头涉及到八个方向,上、下、左、右都很简单,斜方向的箭头就会有一个角度换算的问题,算法稍微有点复杂,所以做下笔记,供参考; ht...

TestLink 安装与使用

部署TestLink测试工具   1.安装epel软件 rpm -Uvh http://mirrors.ustc.edu.cn/fedora/epel/6/x86_64/epel-release-6-...

读写dicom数据集 matlab

  • 2015年02月01日 08:00
  • 2KB
  • 下载

DICOM数据集与DCM文件格式

  • 2011年11月23日 11:51
  • 33KB
  • 下载

【Linux】CentOS7 常用命令集合

这两天一直在对CentOS 7.2进行初体验,各种学习命令肿么用,不过其实大多和DOS是一样的,只是命令的表达上可能有点儿不一样,毕竟这些都不是一家出来的嘛~这里就分享一些近期我常用的CentOS命令...

MySql数据备份常用命令集

  • 2012年09月13日 14:41
  • 4KB
  • 下载

快速 CentOS6.3 配置安装 Oracle11gR2 命令集

=============================================== cat /etc/sysconfig/network-scripts/ifcfg-eth0 vi /...

tcl/tk学习笔记:字符串(二)string命令集

1.从字符串中获取字符 string index 和string range string index string n; 获取string的第n个字符,从0开始算 例 string inde...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:DICOM命令集和数据集解析
举报原因:
原因补充:

(最多只允许输入30个字)