【转】DICOM命令集和数据集解析!!

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/435758.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【转】WPF XAML X名称空间详解

转自:WPF XAML X名称空间详解_郎涯技术-CSDN博客 X名称空间里面的成员(如X:Name,X:Class)都是写给XAML编译器看的、用来引导XAML编译器将XAML代码编译为CLR代码。 【X名称空间里面到底都有些什么】 x名称空间映射的是:http://schemas.microsoft.com/winfx/2006/xam…

C++编绎器编绎C语言的问题

由于应用的需要,要在原来的C语言中加入C类,这时就会出现很多类型转换的错误,因为在C语言中默认的是强制转换的,而在C中不会自动强制转换,只能手工强制转化。所以出现错误了,只有一个错误一个错误的改了。我…

关于mult-xip bin的一些资料整理

一.实现multbin 1.首先修改config.bib 比如:#elif defined IMGMULTIBIN; NAME START ADDR SIZE TYPE; ----------------------------------------------------------------NK 80220000 007DE000 RAMIMAGE SHELL 809FE000 001…

x210-II WinCE启动10s,还可继续优化

为提高boot引导速度,,需支持multibin。方法如下: 1.D:\WINCE600\PLATFORM\SMDKV210\SMDKV210.bat REM For Multiple XIP (using demand paging on BINFS) set IMGMULTIXIP1 2.调整config.bib镜像大小 由于系统生成的XIPKERNEL约为3M。大于默认设置。所…

【转】DICOM医学图像处理:DICOM网络传输

背景: 专栏取名为DICOM医学图像处理原因是:博主是从医学图像处理算法研究时开始接触DICOM协议的。当初认识有局限性,认为DICOM只是一个简单的文件格式约定,简而言之,我当时认为DICOM协议就是扩展名为DCM文件的格式说明…

symbian c++ 开发环境Carbide.c++搭建

需要的东东:JDK1.3.1以上(自带了,不用安装),SDK 2.0 以上(CW版本),perl5.8.x carbide.c 免费版本 所以的东西都默认安装,下一步-->下一步,^_^! 现在开发用的最多的可能就是VC6了,听说以…

【转】9、XAML名称空间详解

转自&#xff1a;9、XAML名称空间详解 - 种花生的读书人 - 博客园 XAML命名空间 <Window xmlns"http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x"http://schemas.microsoft.com/winfx/2006/xaml"> </Window> xmlnshttp:…

ASP.NET中使用非托管DLL

在ASP.NET窗体页面中使用非托管的DLL&#xff0c;则该DLL的部署则成了一大麻烦事&#xff0c;你把他放在bin目录下不管用&#xff0c;网上介绍了几种解决办法&#xff0c;貌似有点繁琐&#xff0c;其实只要新建一个程序集项目来封装这个DLL中被调用的函数&#xff0c;然后在Web…

【转】Linux的.a、.so和.o文件

转自&#xff1a;Linux的.a、.so和.o文件_chlele0105的专栏-CSDN博客 在说明Linux的.a、.so和.o文件关系之前&#xff0c;先来看看windows下obj,lib,dll,exe的关系 windows下obj,lib,dll,exe的关系 lib是和dll对应的。lib是静态链接库的库文件&#xff0c;dll是动态链接库的库…

wince使用自定义字体

在wince中使用自定义字体其实很简单&#xff0c;只要将自已的字体加到你的程序中就可以使用了&#xff0c;在使用完后再将其清除掉。以wince中加使用"Georgia”字体为例&#xff1a; 在程序初始化的时候将你的字体加载进程序 AddFontResource(L"NandFlash\\Font\\Geo…

Visual Studio 2008 十大新功能

VS2005还没有最终稳定的版本&#xff0c;但是我想在微软的某个办公室&#xff0c;一个项目组正在研究发展Visual Studio 2008这个版本。我看了一下表&#xff0c;现在的时间是公元2006-3-9日&#xff0c;离微软发布VS2008版的α版还有整整18个月&#xff0c;我不知道它最终会是…

【转】linx 设备名字来由 sd sr sg st

转自&#xff1a;/dev/sr0 与/dev/cdrom_luoweifeng1989的博客-CSDN博客_/dev/sr0 一直不知道 sda sdb sr0 这些名字的前两两个字母是什么意思 > > On Tue, Nov 3, 2009 at 9:34 AM, Derek Broughton > > <derekpointerstop.ca>wrote: > > Transla…

wince6.0中文内核定制

对WinCE体积进行剪裁&#xff0c;并让WinCE支持简体中文和英文显示&#xff0c;默认显示是中文,并以下对字体选取 作详细的说明&#xff1b; 关键操作步骤: 1.先创建一个WINCE内核工程. 2.先打开目标的工程文件&#xff0c;单击“Project”菜单&#xff0c;再单击“Properties-…

java 中的堆和栈

Java把内存划分成两种&#xff1a;一种是栈内存&#xff0c;一种是堆内存。 在函数中定义的一些基本类型的变量和对象的引用变量都在函数的栈内存中分配。 当在一段代码块定义一个变量时&#xff0c;Java就在栈中为这个变量分配内存空间&#xff0c;当超过变量的作用域后&#…

【转】ubuntu 开机sudo启动应用程序

转自&#xff1a;ubuntu 开机sudo启动应用程序_Honhy的博客-CSDN博客_sudo 启动应用 第一步&#xff1a;创建一个脚本(run.sh)&#xff0c;我是放在桌面&#xff0c;脚本内容为: echo "hon123"|sudo -S /home/python/qt/Tools/QtCreator/bin/qtcreator exit 0 橙色的…

WinCE Emulator使用介绍

最近用了一下WinCE的模拟器&#xff0c;我做WinCE有几年了&#xff0c;从来没有用过WinCE的模拟器&#xff0c;第一次接触WinCE的时候就是一块S3C2410的板子和PB4.2的开发平台&#xff0c;然后就开始折腾&#xff0c;后来各种开发板都用过&#xff0c;WinCE也从4.2版本用到了6.…

lucene中对不同的域使用不同的分析器

在lucene使用过程中&#xff0c;如果要对同一IndexWriter中不同Document&#xff0c;不同Field中使用不同的analyzer&#xff0c;我们该如何实现呢&#xff1f; 通过对《lucene in action》的阅读&#xff0c;发现是可以解决这一问题的。lucene可以正对整个IndexWriter对象或者…

【转】Ubuntu Desktop下自动启动终端并运行脚本

转自&#xff1a;Ubuntu Desktop下自动启动终端并运行脚本 - 简书 alexubuntu19:~# lsb_release -a No LSB modules are available. Distributor ID: Ubuntu Description: Ubuntu 19.04 Release: 19.04 Codename: disco alexubuntu19:~# uname -a Linux ubunt…

使用js实现换肤功能

Skin.html <html xmlns"http://www.w3.org/1999/xhtml"> <head> <meta http-equiv"Content-Type" content"text/html; charsetgb2312" /> <title>网页焕肤</title> <style type"text/css"> #main…

【转】开机出现 error:file “/boot/grub/i386-pc/normal.mod“ not found 错误提示

今天用ubuntu启动盘格式化了一个分区后&#xff0c;更改了分区顺序&#xff0c;导致找不到normal.mod文件。 现在openSUSE系统无法启动。 error:file "/boot/grub/i386-pc/normal.mod" not found grub rescue> 在网上查询了很多&#xff0c;步骤如下&#xff…