DICOM文件头信息读取及解析
2012-10-20尤超
尤 超
0 引言
DICOM是美国放射学会和美国电器制造商协会组织制定的,专门用于医学图像的存储和传输的标准,它涵盖了医学数字图像的采集、归档、通信、显示及查询等几乎所有信息交换的协议,结构化地定义了医疗图像设备制造厂商的兼容性声明。
DICOM标准的推出与实现,大大简化了医学影像信息交换的实现,并且由于DICOM的开放性与互联性,使得医学影像与其它医学应用系统(HIS、RIS等)的集成成为可能。各类医学影像图像,例如心血管造影、超声、CT、核磁共振等图像,在医学分析方面也越来越具有诊断性和借鉴性。如果DICOM图像在医院转诊或是医学研究教育中用来参考、借鉴、浏览, 那么对于医学影像条件不够成熟的医院来说,从DICOM文件转换出来的有损电子图像文件(例如 JPG),必然会有一些影响,严重的甚至会影响医疗诊断结果。而以DICOM文件方式保存的原始医学图像,只有借助相关的医学影像系统或者DICOM设备,才可以进行读取,对图像浏览用户群,有着很大的限制。
本文将对DICOM文件头的组成和内容进行分析,通过程序实现对DICOM文件头的信息读取,进而利用所获得的信息,进一步读取DICOM文件中的数据集存储内容。此方法是读取DICOM文件的基本解析过程,可以将对DICOM文件的读取,从程序开发商的集成平台中分离出来,在结合图像显示程序之后,作为独立的DICOM文件读取程序使用。
1 DICOM文件基础理论
1.1 DICOM文件构成
DICOM文件,是指按照DICOM标准而存储的医学文件,是一种专用存储格式,后缀为.dcm。它实际上提供了一种封装方式,将DICOM IOD的一个SOP实例,以数据集的形式封装在一个文件中,一般由一个DICOM文件头和一个DICOM数据集合组成。它的组成,如图1所示:
图1 DICOM数据集合组成图
图中的SOP指服务-对象对(Service-Object Pair), 每个文件包含一个单一的SOP实例,其中包含有一帧或多帧图像。
存放DCM文件参数的文件头和图点数据(pixel data)构成了DCM文件,如图2所示:
图2 DCM 文件的DIR 架构
从物理结构上来看,首先是文件元信息的定义,目录信息,然后是4个内容层次:Patient (病人) 、Study (检验) 、Series (系列) 、Image (图像) 。头几层的内容,在很多图像里是相同的,它们在每个图像文件里都要有。文件头描述图像的基本参数:如病人基本资料、检验基本资料、系列资料、以及具有描述图像的基本参数(几行、几列、每点用了几位、有否压缩、调色板。
1.2 DICOM文件头构成以及作用
DICOM文件头(DICOM File Meta Information)又称为“文件元”,是整个DICOM文件中最复杂的部分,它包含了标识数据集合的各种相关信息,包括病人信息、检查信息等。每个DICOM文件,都必须包括该文件头。文件头的最开始是文件前言,它通常由128个00H字节组成,接下来是DICOM前缀,它是一个长度为4字节的字符串“DICM”,可以根据该值来判断一个文件是不是DICOM文件。前言和前缀之后是具有标记符和长度的一套DICOM元要素,除它们之外,所有其它的文件头元素,都必须采用规定的显示格式编码,各个数据元素排列的顺序,按照标签数值从小到大的传输格式(Little Endian) 编码,如表1所示:
表1 DICOM文件元信息(部分)
表1列出了DICOM文件头元信息的部分内容规则,每个文件头元素的长度必须为偶数,否则应该按照规定补充一个字节。其中UDI称为“唯一标识符”,它的产生机制是<根>.<后缀>,是用来标识DICOM标准中,各种不同信息对象的字符串,以保证不同国家、地区、生产商生成的标识,可在世界上任何地点,也可与其它生产商生成的标识相互区别。所有(0002,****) 类的标签都为DICOM所保留。为了兼容后续版本,如果发现文件中有目前尚未规定的 (0002,****)类标签,则应该忽略它。
2 DICOM文件头读取及解析
2.1 数据元素组成及表示
要读懂DCM文件的信息,首先要了解DCM文件中的数据元素组成。数据元素,都是通过(TAG)进行唯一性标识的,即我们看到的8位16进制数,如 (0002,0001),前4位是组号(Group Number),后4位是元素号(Element Number)。
显式时
Tag(group ,element) VR Value Length Value
隐式时
Tag(group ,element) 00H Value Length Value
标记符(Tag)用4字节的16进制数表示,前面2字节的数是数据元素的组号,后面2字节的数是元素号。组号为偶数的是标准数据元素,具体含义可以在DICOM的数据字典中查到。
VR有显式和隐式2种方式,当显式传输时,VR有值,当隐式传输时,VR无值;另外,组号是0002的元素都是显式的。
当VR值是OB,OW,OF,SQ,UT或者UN的时候,VR的长度为4字节,由2字节的字符串和2字节的00H组成。当VR值是其他值的时候,VR的长度为2字节,即2字节的字符串。
Value Length的长度是根据VR可变的,共有2种长度,当VR为OB,OW,OF,SQ,UT或者UN的时候长度为4字节。当VR为其他值时,长度为2字节。Value Length表示的是Value的长度,另外,当Data Length的长度不为偶数时,则根据需要添加前缀或者后缀补齐。
2.2 DCM文件头读取设计和实现
本文基于C#进行DCM读取的设计,首先将一个DCM文件读入到内存后,按照文件结构顺序进行信息获取。
DICOM文件头的最开始是文件前言,这部分为128位为空字符,由”0”表示,直接读取即可,之后读取文件头前缀的4个字节,并记录这个4个字节进行分析,判断所读文件是否为DICOM文件,判断标准是看是否为4字节的大写字符串“DICM”,通过ASC码表对应并转换成16进制就是“4449434D”,只有判断符合才进一步做分析。
文件头元素默认的传输语法,是隐式值表示法(VR)Little Endian,在这个传输语法下,数据元素的格式为组号(2字节)、元素号(2字节)、值长度(4字节)以及值(值长度给出的字节数),所以读取4字节,是为了将TAG位解析出来,按照Little Endian的规则,2字节的组成方法,是后一位+前一位,例如4字节“02000000”中,按照传输语法解析,就是读取2字节(0200)表示组号为0002,2字节(0000)表示元素号为0000,从而构成了Tag(0002,0000);而后对该数据元素其他部分的解析也按照类似的方法进行。
至此,DICOM文件头的一条数据元素读取完成,之后按照上述过程反复读取文件内的其他数据元素,当全部数据元素读取完成后,一个DICOM文件头的信息也就分析出来,包括病人信息、检查信息等等。第三行即为程序中读取的内容,如图3所示:
图3 第三行读取的内容
第三行的(02000000554C 0400 A8000000)读取下来,就是2字节(0200)表示组号为0002,2字节(0000)表示元素号为0000,构成了 Tag(0002,0000);而 0002组号的元素是显示的,即2字节(554C),转换成10进制再由ACS码表知道是UL;2字节(0400)表示长度为4;4字节(A8000000)表示该数据值域为168。需要注意的是,根据DCOM头元素要求,组号标签为0002的头元素中强制要求的有(0002,0000),(0002,0001),(0002,0002),(0002,0003),(0002,0010),(0002,0012),而在其后面组号标签为其他的数据元素将表示其他的基本信息。
3 程序结果分析及讨论
在整个解析过程中可以看到,对DICOM文件头的编程过程并不困难,大多数是对文件中16进制数据的读取、转换、移位、判断,而关键在于,必须清楚的判断出每条数据元素的传输语法类型,不同的传输语法,将决定不同的读取顺序,这就要求开发人员必须熟悉并深入了解DICOM文件头以及数据元素的组成和含义,特别是值表示法和值长度在不同情况下的表示及意义,其中隐式就要采用预先规定的表示方法,通过标记从共享的数据字典中查到DICOM对这个属性表示方法的规定,而显式则要用两个字符明确表示值的表示方法,如AE表示应用实体,AS表示年龄字符串,DT是日期和时间,FD表示双精度浮点数等,至于值长度在隐式和显式下也不同,这就需要加强对DICOM文件的学习和理解了。
4 总结
DICOM文件头信息的解析,在DICOM文件的读取过程中占有重要意义,同时结合图像读取显示程序,将文件头内的成像参数进行显影和绘制,最终显示图像。现在有很多利用 VTK、ITK集成或是用当前主流程序语言设计的像素显影程序,都已经可以很好的进行像素点描绘,并且在尽可能减少像素缺损的情况下,呈现出图像的原来面貌。我们可以利用成熟的计算机技术,将两方面进行统一接口设计和程序实现,将文件头的读取与像素集合的绘制,用更便捷开放的技术结合在一起,为医学影像方面提供广泛、创新的技术指导和支持。
[1]胡胜文,荆保国,梁玉新, 基于Qt4的DICOM文件数据读取和图像显示[J], 科技信息,2011,(13),818-819.
[2]张翔,陈胜勇, 利用VTK的DICOM图像的显示与信息读取[J], 电脑知识与技术:学术交流, 2011, 7(4),2343-2344.
[3]王旭 翟,红英, 基于OpenGL的DICOM医学图像读取和显示[J], 计算机应用,2009,29(B12),126-127,130.
[4]黄旭, DICOM 医学图像数据的读取[J], 计算机时代,2008,(11),46-47.