李志鹏,王明泉,2,张俊生,2
(1.中北大学 信息与通信工程学院, 太原 030051;2.中北大学 仪器科学与动态测试教育部重点实验室, 太原 030051)
基于DCMTK的DICONDE文件构造生成
李志鹏1,王明泉1,2,张俊生1,2
(1.中北大学 信息与通信工程学院, 太原 030051;2.中北大学 仪器科学与动态测试教育部重点实验室, 太原 030051)
DICONDE是无损检测领域数字成像与通信的国际标准,其文件的构造生成是普及该标准的基础,基于DCMTK开发库进行了相关的研究。首先在分析DICONDE信息模型的基础上,给出了构造DICONDE的一般流程;然后以数字X射线图像存储系统为例搭建了基于DCMTK的开发环境,给出了详细的开发步骤;最后用专业软件测试生成的文件。结果表明:生成的文件均能被识别为DICONDE文件并正确读取图像及相关信息,且支持中文;基于DCMTK开发库降低了开发难度,具有一定实用价值。
DICONDE;构造生成;DCMTK;图像存储系统
DICONDE(Digital Imaging and Communication in Nondestructive Evaluation)是为方便无损检测领域厂商和用户共享数据逐步发展起来的标准,其衍生于广泛使用的DICOM (Digital Imaging and Communications in Medicine)标准[1]。本质上讲,其是一个允许图像和其相关信息(组件、研究、设备、缺陷等)存储在一起的系统。
DICONDE文件的生成存储是普及该标准的基础,并引起了无损检测行业的重视,如我国2015年9月1日起实施的关于承压设备无损检测的行业标准(NB/T 47013.11-2015《承压设备无损检测 第11部分:X射线数字成像检测》)对图像存储有“存储格式宜按照DICONDE格式执行”的说明。在此背景下,对DICONDE文件的构造生成做了研究。
如果从头开始理解DICONDE标准,然后完全自行编写代码来实现这些标准,是一件工程浩大的事情。德国OFFIS公司开发的DCMTK(DICOM Toolkit)开发库,为使用者提供了实现DICONDE标准的一个平台,使得使用者可以在它的基础上轻松地完成自己的主要工作,而不必把太多的精力放在实现DICONDE标准的细节问题上。笔者基于DCMTK开发库, 给出了构造DICONDE的一般流程,实现了对DICONDE文件的宏观设计;并以数字X射线图像存储系统为例,搭建了基于DCMTK开发库的开发环境,简便地构造生成了DICONDE文件。
1.1 DICONDE的信息模型
1.1.1 基本结构
DICONDE信息模型定义了与无损检测图像通信相关信息的组织结构,其基本组织结构如下:
信息对象定义(IOD, Information Object Definition):对现实世界中无损检测实体的面向对象的抽象,对一类具有共同属性实体的抽象。IOD由多个信息模块组成,每个模块又由多个属性组成,如此构成树状结构。例如数字X射线(DX, Digital X-ray)图像IOD包含组件、组件研究、无损检测设备等模块,其中组件模块包含组件名称、材料名称、厚度等属性[2]。IOD 分为两类[3]:标准 IOD,只包含 DICONDE信息模型中单个实体的信息;复合 IOD,包含了 DICONDE信息模型中多个实体的部分信息。
DIMSE(DICOM Message Service Element)服务是针对 IOD对象所能进行的各种操作的抽象。DIMSE服务分为两类:DIMSE-N服务,只适用于标准IOD;DIMSE-C服务,只适用于复合IOD。复合服务包括验证服务、存档服务、 取文档服务、查询服务、文档移动服务[4]。DIMSE服务组由一组DIMSE服务或者介质存储服务组成。
服务对象对类(SOP, Service-Object Pair):由IOD 和相关的DIMSE 服务组一对一配对组成。DICONDE信息模型中的 SOP类相当于面向对象中对象的类,属性相当于对象的成员变量,服务组相当于对象的成员函数。
服务类(Service Class):由一至多个SOP组成。DICONDE共定义了8个服务类,其中4个是复合服务类,另4个是标准服务类。复合服务类中存储服务类可以提供基本传输和存储图像的服务。
1.1.2 结构关系
DICONDE信息模型中主要结构之间的关系[5]如图1所示。每个服务类指定了多个服务对象对类(SOP类),每个SOP类又由一个服务组和一个IOD组成。该服务组应用于该IOD上,类似于面向对象技术中类的成员函数和成员变量的关系。每个服务组是一组DIMSE服务或者介质存储服务,每个IOD包含了多个属性。
图1 DICONDE信息模型中主要结构的关系
1.2 DICONDE的构造流程
从上面的信息模型可知,要实现一定的功能,首先要选择能提供该操作的服务类。该服务类和多个SOP类相关,使用者可从中选择所需要的SOP类。一旦SOP类选定,相应的IOD和DIMSE服务也就可以确定;然后就可给相应的属性赋值,使用DIMSE服务或介质存储服务来完成相应的操作。
以数字X射线图像存储系统为例,首先选定存储服务类,由于系统使用的是用于呈现的X射线数字图像,所以选定用于呈现的数字X射线图像存储SOP类。接下来对相应的DX图像IOD中的属性进行确定,同时确定要使用的介质存储服务。根据这个模型可以方便地选择所要使用的各个相关信息来完成所需的功能。
图2 DICONDE文件的结构
1.3 DICONDE文件的结构
DICONDE标准允许将数据的传输结果存成DICONDE文件的形式,典型的DICONDE文件结构如图2所示。其由以下部分组成:① 导言。共128个字节,可将文件的有关说明放在导言中。② 前缀。4个字节,规定为 “D”、 “I”、 “C”、 “M”共4个字符。③ 数据元素。一般会有很多组数据元素,每个数据元素对应一个IOD的属性。
每个数据元素具有以下的统一格式和内容:① 标识符。其是占4个字节的无符号整数,前两个字节是组号,后两个字节是元素号,十六进制下格式是(gggg,eeee)。其中组号表明这个数据元素属于哪个数据组,而元素号用于区分同一组中的不同数据元素;组号和元素号组成的标识符唯一表示一个特定的数据元素,数据字典就是依据标识符来检索不同数据的[6]。② 数据类型(VR, Value Representation)。其占用2个字节,规定了数据元素的数据类型和格式,VR根据不同的传输语法可以省略。③ 数据长度。其指定数据的长度,占2个字节或 4个字节。DICONDE标准规定数据长度必须是偶数,不足时要补齐。④ 数据。该数据元素所代表属性的实际值,必须包含偶数个字节。
数据元素中一组组号为2的数据元素被称为元信息,其决定了DICONDE文件的传输语法,提供了介质存储SOP类 UID(Unique Identifier)、介质存储SOP类实例UID、实现类 UID等重要信息。紧随文件元信息之后的是数据集,它是很多数据元素的集合,也是DICONDE文件构造的重点。整体来看数据集主要包括组件、研究、序列、设备等信息模块及相应的属性,其中标签为(7FEO, 0010)的数据元素是用来存放图像的像素数据的。
以数字X射线图像存储系统为例,基于DCMTK开发库实现DICONDE文件的构造生成。
2.1 搭建开发环境 以使用广泛的VC++语言进行开发,开发环境为配置DCMTK 3.6.0开发库的Visual Studio 2013(VS 2013)。搭建过程如下:
2.1.1 准备工作
(1) 首先下载DCMTK 3.6.0源码,并根据工程的运行库属性MT(Multi-threaded)或MD(Multi-threaded DLL)类型下载源码编译用的支持库。文中用的是MD类型的支持库。
(2) 下载并安装跨平台编译工具CMake,用于将DCMTK源码在自定义配置下生成VS 2013工程。文中用的CMake版本为3.3.1。
(3) 为避免2.1.3(1)中由于支持库编译器版本较老而出现关于“SAFESEH image”的错误,在一个现有的VS 2013工程下,将默认用户属性页Microsoft.Cpp.Win32.user中linker/advanced/Image has Safe Exception Handlers选项设为No (/SAFESEH:NO)[7]。
2.1.2 CMake编译生成VS工程
(1) 将源码文件里CMakeLists.txt(CMake默认配置文件)中的“/MT”替换为“/MD”,“/MTd”替换为“/MDd”[8]。
(2) 打开CMake程序,“where is the source code”选择到源码路径,“where to build the binaries”选择到存放生成工程的文件路径。
(3) 在“Configure”里配置相应的编译器,等待初次配置完成后,在红色的配置区勾选上编译使用的支持库及库文件路径,如图3所示。
(4) 再次点击“Configure”,等待配置完成,点击“Generate”即生成相应的VS 2013工程。
图3 CMake中配置支持库
2.1.3 VS编译生成开发库
(1) 打开上述生成文件里的VS工程DCMTK.sln,然后选择“ALL_BUILD”子工程并编译,成功后选择“INSTALL”子工程并编译,则会生成DICONDE开发所需的include、lib、bin等开发库文件(生成默认路径为C:Program FilesDCMTK)。
(2) 补充zlib库文件。由于zlib库文件是成功编译DCMTK工程必须的文件,而上述生成的lib文件里没有此库文件,故要补充。将zlib-1.2.5支持库文件里的zlib_d.lib或zlib_o.lib(_d和_o分别对应Debug和Release模式)复制到(1)中生成的lib文件夹下即可。
2.1.4 为新工程配置开发库
新建VS工程,在工程属性页下VC++ Directories里的Include Directories 和 Library Directories 栏添加生成开发库里的include、lib文件的路径。在Linker/Input里的Additional Dependencies栏添加依赖项:wscok32.lib、netapi32.lib、ofstd.lib、oflog.lib、dcmdata.lib、zlib_d.lib、dcmimgle.lib(Debug模式)。
2.2 实现步骤
(1) 实例化操作文件的变量
DCMTK开发库中处理DICONDE文件格式(含元信息)的类是DcmFileFormat,由其可方便获得处理文件中元信息部分的类DcmMetaInfo和数据集部分的类DcmDataset,进而借助相关成员函数写入相应的数据元素。关键代码如下:
DcmFileFormat fileformat;
DcmMetaInfo*metainfo=fileformat.getMetaInfo();
DcmDataset*dataset=fileformat.getDataset()。
(2) 写元信息
写元信息主要是指定介质存储SOP类和传输语法。例子的目的是存储用于呈现的数字X射线图像,因此介质存储SOP类选择用于呈现的数字X射线图像存储SOP类。
传输语法标志了数据集编码方式的不同。DICONDE标准支持多种编码方式,包括压缩和未压缩两类。未压缩编码常用的有三种:隐式 VR小端(默认)、显式VR小端和显式VR 大端[9]。元信息中的数据元素编码不受传输语法的影响,始终为显式VR小端。
图4 显式VR和隐式VR下的数据元素
显式VR和隐式VR下不同的数据元素如图4所示(图中单位为字节),可以看出隐式VR下数据元素的VR将被省略,而显式VR下数据元素中必须有VR,用以显式说明数据的类型。大端、小端指的是数字存储时的字节顺序,不同的计算机存放多字节值的顺序不同,有些情况下在起始地址存放低位字节(小端),另外一些情况下则存放高位字节(大端)。例如十进制数65280小端存储的十六进制形式为0x00FF,而大端存储的十六进制形式为0xFF00。
不同的传输语法生成的DICONDE文件数据元素的结构有差异,读取DICONDE文件时自然也存在差异。编码方式是隐式VR时,需要通过数据字典来获得该标签对应数据元素的值类型;当编码方式是显示 VR时,可以直接读取标签后的2 字节数据,该数据就是VR。基于DCMTK开发库,数据元素的写和读只需指定好标签和要写入的值或存读取数据的变量即可,较简便。文章传输语法使用默认的传输语法——隐式VR小端类型。
关键代码如下:
metainfo->putAndInsertString(DCM_Media StorageSOPClassUID,UID_DigitalXRayImage StorageForPresentation);∥指定介质存储SOP类UID
与表达性问卷(production questionnaires)相比,多项选择问卷降低了任务难度,减少了被试的认知负担,因为被试仅需衡量一组数量非常有限的选项,从中选择一个,不需展开没边际的记忆搜索以生成一个合适的话语(Kasper,2000:330-331)。
metainfo->putAndInsertString(DCM_Transfer SyntaxUID,UID_LittleEndianImplicitTransfer Syntax); //默认的传输语法
函数中的参数均是宏定义,第一个参数(以DCM开头)指明了要写入数据元素的标签号,第二个参数(以UID开头)则唯一地标识相关内容。如DCM_TransferSyntaxUID等价于DcmTagKey(0x0002,0x0010),UID_LittleEndianImplicit TransferSyntax对应的标识为“1.2.840.10008.1.2”。
(3) 写数据集
写数据集是构造生成的重点,主要是指定组件、研究、设备等信息模块及相应的属性。文章总结了DICONDE文件数据集中常用的重要数据元素(见表1),并对复杂的数据元素作了额外说明。
表1 数据集中常用的重要数据元素
(0008,0005),Specific Character Set :表示文件中所采用的字符集。当该标签未出现时,缺省字符集ISO-IR6将被使用。为了让DICONDE文件支持中文,需要将该标签的值设置为“GB18030”,表示使用GB18030字符集。
(0018,1020),Software Versions :是一个多值数据元素。常用来区分DICONDE文件和DICOM文件及具体版本,如果有其他软件版本要存储在该属性内,此时DICONDE的版本一定要存储在第一个位置[10]。
(0028,0004),Photometric Interpretation :表示如何根据像素数据来显示图像。常用的值有MONOCHROME 1、MONOCHROME 2和RGB。当值为MONOCHROME 1时,表示像素数据是一个灰度图像,像素数据中最小的值将显示为白色。当值为MONOCHROME 2时,表示像素数据是一个灰度图像,像素数据中最小的值将显示为黑色。当值为RGB时,表示像素数据是一个RGB图,像素数据中的最小值将显示为该颜色的最小强度。
(0028,0103),Pixel Representation :表示像素取样值的数据类型。为0时表示用无符号整数表示像素取样值点,为1时表示用有符号整数表示像素取样值点。
dataset->putAndInsertString(DcmTagKey(0x0010, 0x0010),“轮毂轮盘”);∥组件名称
dataset->putAndInsertString(DcmTagKey(0x0010, 0x0020), "LP20160322-011");∥组件编号
dataset->putAndInsertString(DcmTagKey(0x0010, 0x0030), "20160322");∥生产日期
dataset->putAndInsertString(DcmTagKey(0x0010, 0x2160),"铝合金");∥材料
dataset->putAndInsertUint8Array(DCM_PixelData, p8, width*height)。∥p8指向8位无符号整数图像数据
(4) 生成文件
借助DcmFileFormat类的成员函数saveFile指定好存储路径及文件名和编码方式(传输语法),即可方便地生成DICONDE文件。关键代码如下:
fileformat.saveFile(“E:\Test.dcm”,EXS_LittleEndianImplicit)。
2.3 结果及分析
使用PowerDiconde v4.9.1试用版和ISee v 1.11.1对上述生成的DICONDE文件进行读取测试。PowerDiconde是德国MHGS公司针对材料检测的检验员及工程师等研发的软件,能对DICONDE文件信息头和图像进行浏览、编辑和分析[11]。ISee是德国联邦材料研究和检测中心研发的射线图像分析软件,它不仅是一个强大的看图软件,而且更擅长于图像分析,如各种测量,高位高分辨率图像的归档[12]。
图5所示为PowerDiconde下读取的部分信息头,可以看到标签号(0010,0010)的数据元素标签名为“Component Name”,并不是DICOM文件中的“Patient Name”,说明文中生成的确实是DICONDE文件。此外材料名称(Material Name)属性的值为“铝合金”,说明了生成的DICONDE文件使用的是中文字符集。图6展示了ISee下读取的图像数据,其为某轮毂轮盘的数字X射线图像。
图5 PowerDiconde下读取的信息头(部分)
图6 ISee下显示的图像数据
(1) 在分析DICONDE信息模型的基础上,给出了构造DICONDE的一般流程,实现了对DICONDE文件的宏观设计。
(2) 以数字X射线图像存储系统为例,搭建了基于DCMTK开发库的开发环境,较简便地构造生成了DICONDE文件。通过使用专业软件测试生成的文件,验证了所采用的基于DCMTK开发库的方法对DICONDE文件的生成存储具有一定的实用价值。
[1] 孙朝明. 数字射线成像中原始图像数据的定义与保存[J]. 无损检测, 2014, 35(2): 56-59.
[2] ASTM E 2699-11 Standard practice for digital imaging and communication in nondestructive evaluation (DICONDE) for digital radiographic (DR) test methods[S].
[3] DICOM PS 3.3-2016a Information object definitions[S].
[4] 李昌领,张虹. DICOM医学图像胶片输出技术的实现[J]. 计算机工程与设计, 2005, 26(8):2226-2228.
[5] DICOM PS 3.4-2016a Service class specifications[S].
[6] 曹玉磊. DICOM标准研究与图像处理工具的实现[D]. 西安: 西安电子科技大学, 2007.
[7] Stack Overflow. Error lnk2026: module unsafe for safeseh image[EB/OL].[2013-02-5].http:∥stackoverflst.com/questions/14710577/error-lnk2026-module-unsafe-for-safeseh-image.
[8] OFFIS DICOM Team. FAQ #26: Compilation of DCMTK-based program fails w/ LNK2005[EB/OL].[2004-11-09].http:∥forum.dcmtk.org/viewtopic.php?t=35#p39.
[9] DICOM PS 3.5-2016a Data structures and encoding[S].
[10] ASTM E 2339-10 Standard practice for digital imaging and communication in nondestructive evaluation (DICONDE)[S].
[11] MHGS Enterprise. PowerDiconde[EB/OL].[2016-12-21].http:∥diconde.mhgsoft.de/powerdiconde.php.
[12] BAM. ISee[EB/OL].[2014-08-31].http:∥www.dir.bam.de/ic/.
The Construction and Generation of DICONDE File Based on DCMTK
LI Zhi-peng1, WANG Ming-quan1,2, ZHANG Jun-sheng1,2
(1.School of Information and Communication Engineering, North University of China, Taiyuan 030051, China; 2.Key Laboratory of Instrumentation Science & Dynamic Measurement, Ministry of Education, North University of China, Taiyuan 030051, China)
DICONDE as an international standard for digital imaging and communications in Nondestructive Evaluation, the construction and generation of its file is basis of generalizing the standard and the relative research was carried out based on DCMTK. Firstly, based on careful analysis of the information model of DICONDE, the constructing procedure of DICONDE was given. Then, taking the storage system of digital X-ray image as example, the developing environment based on DCMTK was set up and the detailed developing procedure was given. At last, the generated files were tested by professional software. The result showed that the generated files could be identified as DICONDE file, and the image and other information in the files were read correctly. In addtion, it also supported Chinese. Besides, the way based on DCMTK was easier to develop and had some practical value.
DICONDE; Construction and generation; DCMTK; Image storage system
2016-07-11
国家重大仪器专项资助项目(2013YQ240803);山西省科技攻关资助项目(20140321010-02);中北大学研究生科技基金资助课题(20151238)
李志鹏(1991-),男,硕士研究生,主要研究方向为无损检测DR软件系统,图像处理。
李志鹏,E-mail: 969011231@qq.com。
10.11973/wsjc201704010
TP391.41;TG115.28
A
1000-6656(2017)04-0049-05