转自: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

【转】DICOM命令集和数据集解析!!相关推荐

  1. KDD CUP 99 数据集解析、挖掘与下载

    KDD CUP 99 数据集解析.挖掘与下载 数据特征描述 一个网络连接定义为在某个时间内从开始到结束的TCP数据包序列,并且在这段时间内,数据在预定义的协议下(如TCP.UDP)从源IP地址到目的I ...

  2. CASIA -HWDB2.0-2.2和OLHWDB2.0-2.2数据集解析

    CASIA -HWDB2.0-2.2数据集解析 下载地址 数据集解释 HWDB解析dgrl为图像和txt 标签 转换代码 OLHWDB数据集wptt 解析成图像 转换代码 生成class 唯一值文本 ...

  3. 【Qt】通过QtCreator源码学习Qt(六):命令行参数解析实现

    参考下大神的命令行参数解析是如何是实现的 //使用const char []代替宏定义字符串,我以前都是用const QString,想想好傻 const char SETTINGS_OPTION[] ...

  4. python命令行参数解析OptionParser类用法实例

    python命令行参数解析OptionParser类用法实例 本文实例讲述了python命令行参数解析OptionParser类的用法,分享给大家供大家参考. 具体代码如下:     from opt ...

  5. 3gpp文件头文件解析_居于LLVM 的命令行参数解析

    在写命令行程序的时候经常需要解析各种命令行参数.打印help信息等,觉得非常的麻烦.今天介绍一种超级棒的命令参数解析的方法:居于LLVM 的命令行参数解析,有了它妈妈再也不用担心我不会解析命令行参数^ ...

  6. Python命令行参数解析模块------argparse

      首先,argparse 是python自带的命令行参数解析包,可以用来方便地读取命令行参数,当你的代码需要频繁地修改参数的时候,使用这个工具可以将参数和代码分离开来,让你的代码更简洁,适用范围更广 ...

  7. 编程模板-R语言脚本写作:最简单的统计与绘图,包安装、命令行参数解析、文件读取、表格和矢量图输出

    写在前面 个人认为:是否能熟悉使用Shell(项目流程搭建)+R(数据统计与可视化)+Perl/Python等(胶水语言,数据格式转换,软件间衔接)三门语言是一位合格生物信息工程师的标准. 之前分享过 ...

  8. Python中最好用的命令行参数解析工具

    Python 做为一个脚本语言,可以很方便地写各种工具.当你在服务端要运行一个工具或服务时,输入参数似乎是一种硬需(当然你也可以通过配置文件来实现). 如果要以命令行执行,那你需要解析一个命令行参数解 ...

  9. python 命令行参数-Python 中最好用的命令行参数解析工具

    Python 做为一个脚本语言,可以很方便地写各种工具.当你在服务端要运行一个工具或服务时,输入参数似乎是一种硬需(当然你也可以通过配置文件来实现). 如果要以命令行执行,那你需要一个命令行参数解析的 ...

最新文章

  1. 关于java类型数据组的调用
  2. SQLSERVER得到数据库中所有表字段及字段中文描述
  3. java范型_Java知识点总结(Java泛型)
  4. Tomcat 服务器只能存有一个正在运行的项目
  5. spi app理解和编写测试
  6. php authorization,PHP CURL设置Authorization
  7. windows 下访问bsd系统分区的小工具 ____FFS driver mount manager
  8. 【剑指offer中等部分4】二进制中1的个数(java)
  9. ffmpeg的一些用法,不定期更新
  10. Pr视频剪辑出现红线
  11. 获取shell文件路径方法
  12. C语言实现连接MySQL服务器CURD
  13. 给你一个全自动的屏幕适配方案(基于SW方案)!—— 解放你和UI的双手
  14. 水果店开业活动策划,水果店开业怎么搞活动
  15. Qt下 汉字转换拼音
  16. 计算机网络哪个学校好厦门,厦门较好的的计算机学校有哪几间
  17. Qt实现小型的超市收银系统
  18. 用java合并pdf文件
  19. 历届研究生数学建模赛题汇总(转载)
  20. 前端兼容性问题解决方案(二)

热门文章

  1. Spring Boot----Dubbo
  2. 小程序云开发实战 - 口袋工具之“历史上的今天”
  3. BZOJ5020: [THUWC 2017]在美妙的数学王国中畅游(LCT,泰勒展开,二项式定理)
  4. Windows10搭建FTP服务器
  5. 面向对象chapter1
  6. sql server 自定义函数
  7. DevExpress.Utils.ToolTipLocation
  8. Python之异常追踪模块:traceback
  9. 关于html和javascript在浏览器中的加载顺序问题的讨论(zz)
  10. 什么是word2vector