DICOM资料整理.docx

上传人:b****6 文档编号:8761126 上传时间:2023-02-01 格式:DOCX 页数:15 大小:1.42MB
下载 相关 举报
DICOM资料整理.docx_第1页
第1页 / 共15页
DICOM资料整理.docx_第2页
第2页 / 共15页
DICOM资料整理.docx_第3页
第3页 / 共15页
DICOM资料整理.docx_第4页
第4页 / 共15页
DICOM资料整理.docx_第5页
第5页 / 共15页
点击查看更多>>
下载资源
资源描述

DICOM资料整理.docx

《DICOM资料整理.docx》由会员分享,可在线阅读,更多相关《DICOM资料整理.docx(15页珍藏版)》请在冰豆网上搜索。

DICOM资料整理.docx

DICOM资料整理

一:

DICOM简介

DICOM(DigitalImagingandCommunicationsinMedicine)即医学数字成像和通信,是医学图像和相关信息的国际标准(ISO12052)。

它定义了质量能满足临床需要的可用于数据交换的医学图像格式。

所有现实世界的东西,如病人、医疗设备等都被DICOM视为拥有着一些属性(attribute)的对象(object)。

这些对象和属性被定义为IODs(DICOMInformationObjectDefinitions)。

例如一个病人IOD,可以被姓名、性别、年龄、体重、抽烟状态、病历ID等这些和医疗相关的属性(attribute)来描述。

DICOM中包含了大量的这种属性(有2000多个)。

这些属性的值有27种形式,被称为(VR,ValueREpresentation).

DICOM的数据表示形式

tag

数据形式(VR)

数据长度(L)

数据值(Value)

(0010,0010)

PN

4

Jami

(0010,0040)

CS

1

M

其中,(0010,0010)病人姓名,(0010,0040)病人性别;

二:

关于计算机的一些基础知识回顾

(1)二进制

计算机是二进制的,用0、1表示。

一个bit就是一个数字,0或者1。

1byte=8bit。

一个byte的数据有(2^8=256)种可能,取值范围为0~255。

计算机存储、读写二进制数据都是以byte为单位的,如果要存储13bits的数据,计算机就得分配2个bytes的空间(16bits)。

我们使用的颜色也可以使用一个byte来代表它的灰度级,另外一个byte也足以存储一个Latin字母。

要存储12个字母就需要12个bytes的空间,一个字母占一个byte.

(2)16进制数

例:

0x007F占了2个byte,在十进制的情况下它的值为7*16+15=127。

几乎所有的DICOM数据都是用16进制的形式存储的。

(3)大端模式(BigEndian)与小端模式(LittleEndianorder)

大端模式(Big-Endian)就是高位字节排放在内存的低地址端,低位字节排放在内存的高地址端。

小端模式(Little-Endian)就是低位字节排放在内存的低地址端,高位字节排放在内存的高地址端。

例:

16进制的数0x12345678在Little-endian模式以及Big-endian模式在内存中的存放方式为(假设从地址0x4000开始存放):

三:

DICOM中的数据形式

DICOM有27种基本的数据形式,(VRs,ValueRepresentations)。

DICOM中的数据必须满足其中的一种。

每个VR都有一种两个字母的缩写形式。

VR的具体定义见下表:

 

说明:

(1)VRs定义了数据的类型(DataType),并且约定了数据的长度。

DICOM的数据长度一般是偶数的,它们应该含有偶数个的字符或者字节。

对于奇数长度的字符串,通常在它后面加一个空格;对于奇数字节的数字,加一个空的NULL字节,使得它们的字节数为偶数。

例如“Smith^Joe”就会被处理成“Smith^Joe”。

(2)DICOM允许“*”代表任意字符串,“?

”代表任意的一个字母,“\”代表“或”。

(3)IS,DS在DICOM中使用的也很多,尽管对计算机存储来说,它不如二进制的数字合适,但是它不用考虑LittleEndian或者HighEndian,但是它易读,且容易显示。

(4)AT包含了两个字节的数据,就是专门用于(group,element)的tag。

(5)PN代表病人的姓名,一般组成形式为

FamilyName^GivenName^MiddleName^NamePrex^NameSux

例:

“JohnSmith”“Smith^John”。

(6)AE就是DICOM程序应用实体,通常只使用数字和大写字母表示。

(7)UIDs(UniqueIdentifiers),是DICOM数据对象的唯一标识。

(8)SQ(SequencingDataSets),DICOM对象中的元素也可以是DICOM对象。

(9)UN(代表UnknownValue)如果一个数据不符合前面的26个VR数据形式,就用UN来表示。

 

四:

DICOM数据字典(DICOMDICOMDataDictionary)

(一)DICOM标准数据字典(standardDICOMDataDictionary)

DICOM标准数据字典有超过2000多个数据项,这些数根据内容的相近可以被分组为(group,element)。

(group,element)也被称为”tags”。

这些有着tag值的数据元素被称为DICOM属性或者DICOM元素(“attribute”、DICOM“element”、element”)。

上图是一个标准DICOM数据字典列表的一部分,其中第一列为(group,element)元素group和element都是16进制的。

第二列为属性名称(attributeName),其中(group,element)和属性名称是一一对应的。

一般通过(group,element)来寻找属性。

VM(DataelementValueMultiplicity)规定了这种属性的元素可以包含一个或者多个数据值defineswhethertherelatedelementmaycontainonlyonevalueofitstype,orseveral.例如“OtherPatientNames”元素(0010,1001)可以有一个或者多个值,所以值为1-n,其中n代表的是任意数值。

对于有多个数值的情况,如何把它们拼接成一个数据?

如果是二进制数的话就直接拼接,因为它们是定长的,可以根据字节数获取到它们。

如果是字符串类型的,则用“\”来分隔,在DICOM中“\”代表的是“或”。

标准数据字典的例子:

“PatientJohnSmith,Male,bornonAugust6,1954”.

这里面有3个element

“PatientName”(010,0010)

“Patient’sSex”(0010,0040)

“Patient’sBirthDate”(0010,0030).

它们的VRs分别为PN,CS,DA

DICOMEncoding的结果为:

(0010,0010)Smith^John(0010,0030)19540806(0010,0040)M

其中它们的数值得符合VR

(二)私有数据字典(PrivateDICOMDataDictionary)

除了标准数据字典列出来的2000多个属性以外,如果有遇到那其中没有包含的怎么办?

DICOM可以增加自己私有的:

比如增加一个属性(attribute)叫“Patient’sMiddleName”。

注意:

(1)如果group的数值是偶数的,则代表的是标准数据字典(standardDICOMDataDictionary);

如果group的数值是奇数的,则代表的是自定义的私有数据字典。

(2)私有的group数值可以随便设置。

因为私有的group数值是我自己定义的,所以别的DICOM应用可能不能识别这个group是什么含义,但是从它的group是奇数的,可以知道它是私自的。

按照DICOM的规定,不能识别的就会忽略它。

但是如果别的DICOM软件也正好使用了一个(0009,0010)定义了“Physician’sLastName”,就会造成错误。

因此实际中使用private经常会出现问题。

因此使用私有的数据字典的时候要十分地注意。

(三)标准DICOM命令字典(StandardDICOMCOMMANDDictionary)

前面介绍的都是数据元素,但是我们该如何表示对数据的操作?

比如图像的“打印”、“存储”、“Get请求”等?

实际上DICOM命令采用的是和数据一样的编码形式。

且它们们的group数值都是0000,例如(0000,0100)代表的是“commandtype”,而(0000,0110)代表的是“commandmessageid”。

五:

DICOM数据对象(DICOMObjects)

DICOM对象实际上就是由一系列的DICOM元素的组合起来的。

DICOM的数据表示形式

tag

数据形式(VR)

数据长度(L)

数据值(Value)

(0010,0010)

PN

4

Jami

(0010,0040)

CS

1

M

(一)数据元素编码(EncodingDataElements)(转化一系列的二进制表示)

有两种编码方法:

(1)VR隐式编码(implicitVRencoding)(默认采取的),见下图表5

以病人的姓名Smith^Joe为例(以默认的LittleEndian存储表示)。

由于DICOM要求数据的长度为偶数,而“Smith^Joe”现在长度为9,结尾添加空格,变为10,所以其长度为L=10=0x0A。

表5:

VR隐式编码

表6:

VR显式编码例子

从表中可以看出其总共占用了18byte。

(2)VR显式编码(explicitVRencoding)

上面介绍的是VR隐式编码,而VR显式编码与此类似,但它有两种形式:

1>除了(OB,OW,OF,SQ,UT,UN)的VR显式编码

这里VR包含了两个字母,它占用2个byte。

在隐式编码中表示长度的4个字节,被分为VR占2个,长度表示占2个

表7除了(OB,OW,OF,SQ,UT,UN)的VR显式编码

表8除了(OB,OW,OF,SQ,UT,UN)的VR显式编码的例子

2>对于OB,OW,OF,SQ,UT,UN的VR显式编码

这种形式,在VR之后,有两个固定的字节(0x0000),接下来再是4个byte的长度表示。

例如,表示像素值为256*256的图像(一个像素占一个byte,共有256*256=0x00010000字bytes),它的VR为OB,

不能在编码同一个Dicom对象时,不能同时使用隐式的和显式的方法,只能使用统一地一种。

因此在开始编码的时候就要确定采用哪种编码方式。

尽管显式编码看起来有些冗余,它在很多地方都有用处:

(1)可以帮助避免编码错误。

(2)随着DICOM的发展,一些VR可能发生改变,和之前的不一样。

这种情况下,使用VR就保留了原来的值,使程序可以保持对老版本的兼容。

(3)对编码一些非标准VR很重要。

(二)DICOM数据分组编码

DICOM中的元素element都可以被划分为组group。

例如group0010就包含了所有跟病人相关的元素(name,id,weight,age,andsoon)。

Group0028包含了图像相关的元素(width,height,bitandcolordepth),而group7FE0就只包含了图像的像素数据。

奇数的group不包含在DICOMDataDictionary中,它被DICOM厂商用来包含他们自己的专有数据。

当元素被编码到dicom对象时,它们都是按照严格的(group,element)的升序来排的。

一般情况下,常用的一些基本数据的group值都较小,如病人的是0010,这样基实便于它们被找到。

对于DICOM的group“gggg”,它的第一个元素为(gggg,0000),它可以记录所有gggg元素的总长度。

因为所有元素的长度都是偶数的,(gggg,0000)中的长度值也是偶数的。

(gggg,0000)写在一个组的最前面,并且记录了整个组的长度。

它的好处:

(1)如果不需要读gggg这个group时,可以直接根据字节数跳过;因此它可加快DICOM文件的处理过程。

它在处理奇数group数值的时候尤其明显。

因为奇数的group数值自己不能读,可以很快地跳过。

(2)它也可以作为校验。

它的劣处:

在写(gggg,0000)这个元素的时候,你需要知道gggg这个group中所有元素的长度,这意味着这个group中的所有元素必须首先获取到,并且在(gggg,0000)之前已经编码好。

对于DICOM开发者来说,这意味着两件事:

(1)所有的元素都必须编码完成,才能编码object;

(2)修改DICOM对象中一个元素时,就不可避免地修改了它的数值长度,就需要相应的修改它的值。

这样就会带来额来的负担。

在实际处理中,很多DICOM软件会忽略(gggg,0000),或者更坏的情况是写了错误的值。

由于这些原因,group长度这个属性被设置为可选的,你的程序不是必须得写它。

例子:

C-Echo-request(C-Echo-Rq)对象(这是一个DICOM命令对象)

(三)DICOM数据对象的编码

基于前面介绍的数据元素的编码和分组,从而可以知道DICOM对象的编码方法。

因为DICOM对象就是一系列DICOM数据元素的组合。

没有SQ元素的DICOM对象的形式如下图:

(1)SQ序列的DICOM对象的编码

如果DICOM对象中的元素的VR是SQ,则该元素的值可以是一组DICOM对象。

而在这样的DICOM对象元素中,其元素的VR也可以是SQ。

SQ元素的编码方法如下表

说明:

(1)SQ序列中的DICOM对象数据值以(FFFE,E000)开头,接下来有两种情况:

1>DICOM对象数据值有明确的长度;如例1中的第一个和第二个数据对象;

2>DICOM对象数据值没有明确的长度,标记为FFFFFFFF。

如例3中的第二个数据对象;在这种情况下,需要用(FFFE,E0DD)来标识结尾。

(FFFE,E0DD)为一项的值的长度为0,它只是用来标识结尾的。

(2)整个SQ序列也可以有明确的或者不明确的长度

1>例2中,整个序列有确定的长度0x0000A00,长度总和的计算。

2>也可以使用不明确的长度0xFFFFFFFF,因为长度不确定,因此需要在结尾增加标识项(FFFE,E0DD),(FFFE,E0DD)这一项的值的长度也是0;

建议使用隐式编码的方法:

(1)如果计算长度出错,则整个DICOM对象都不可读。

(2)尽管使用明确长度的方法,阅读DICOM时可以很快跳过这一段,但在计算机性能好的今天,这已经微不足道。

编码的时候从下往上:

六:

一些参考资料

(1)DICOM官网:

http:

//dicom.nema.org/

(2)DICOM三大开源库

1>基于C++的dcmtkhttp:

//www.dcmtk.org/

2>基于DCMTK,用C#再次封装(mDCM)

基于C#的fo-dicom(mDCM的升级版)

3>基于java的dcm4che

(3)DICOM医学图像处理专栏

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 高等教育 > 农学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1