DICOM资料整理Word文件下载.docx
- 文档编号:21897314
- 上传时间:2023-02-01
- 格式:DOCX
- 页数:15
- 大小:1.42MB
DICOM资料整理Word文件下载.docx
《DICOM资料整理Word文件下载.docx》由会员分享,可在线阅读,更多相关《DICOM资料整理Word文件下载.docx(15页珍藏版)》请在冰豆网上搜索。
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元素的组合起来的。
(一)数据元素编码(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序列也可以有明确的或者不明确的长度
例2中,整个序列有确定的长度0x0000A00,长度总和的计算。
也可以使用不明确的长度0xFFFFFFFF,因为长度不确定,因此需要在结尾增加标识项(FFFE,E0DD),(FFFE,E0DD)这一项的值的长度也是0;
建议使用隐式编码的方法:
(1)如果计算长度出错,则整个DICOM对象都不可读。
(2)尽管使用明确长度的方法,阅读DICOM时可以很快跳过这一段,但在计算机性能好的今天,这已经微不足道。
编码的时候从下往上:
六:
一些参考资料
(1)DICOM官网:
http:
//dicom.nema.org/
(2)DICOM三大开源库
1>
基于C++的dcmtkhttp:
//www.dcmtk.org/
基于DCMTK,用C#再次封装(mDCM)
基于C#的fo-dicom(mDCM的升级版)
3>
基于java的dcm4che
(3)DICOM医学图像处理专栏
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- DICOM 资料 整理