APP下载

DICOM格式医学图像的读取与显示

2010-01-25李清美

关键词:表示法字节灰度

李清美

(泰山医学院附属泰山医院影像中心,山东 泰安 271000)

DICOM(digital imaging and communications in medicine)标准主要涉及到信息系统中最主要也是最困难的医学图像的成像和通信,可直接应用在放射科信息系统(RIS)和图像存档与通信系统(PACS)中[1]。它的应用促进了医学影像设备之间的互操作性,提供了一种用于医学信息的开放性的数据交换标准,使得不同厂商生产的影像设备形成的图像统一存档与通讯成为可能[2]。现有的大多数图像处理软件都不能直接读取和显示DICOM格式的医学图像。因此,编程实现DICOM格式的医学图像的读取和显示在医学图像处理和临床应用中具有重要意义。本研究首先分析了DICOM格式图像文件的结构,然后给出开窗显示的理论分析,最后,利用C/C++语言在VC++开发环境下编程实现了DICOM格式医学图像的读取和显示。

1 材料和方法

1.1材料

泰山医学院附属医院放射科提供的DICOM格式CT图像100幅,Windows XP 操作系统,Microsoft Visual C++6.0 编程软件。

1.2方法

1.2.1DICOM 图像文件格式 DICOM格式图像文件是按照DICOM标准所生成的图像文件,它有文件元信息和数据集组成。文件元信息也叫文件头,包括封装数据集的识别信息。文件头由128个字节的文件前言、紧随4个字节的DICOM前缀和文件元要素组成。这个文件头将在每个DICOM文件中出现。文件前言可加以利用,正如应用框架或具体的操作所定义的。DICOM标准的这部分对固定大小的前言不要求任何结构。不需要构建成具有标签和一定长度的DICOM数据元素。本部分通过提供与许多常使用的电脑图像文件格式的兼容性,来便利于对DICOM文件中的图像数据和其他数据的访问。不论文件前言是否包含信息,DICOM文件内容应该与该部分要求相符合,数据集应该与文件元信息中指定的SOP(service object pair)类相符合。如果应用框架或特殊操作不使用文件前言,所有128字节都被设置成00H。当所有128字节不按上述规定设置的时候,目的是帮助识别前言被使用过了。4个字节的DICOM前缀将包含字符串“DICM”,它被当作大写字母利用ISO 8859 GO字符指令进行编码。这4个字节前缀没有被构造为具有标记符和长度的DICOM数据元素。前言和前缀之后是具有标记符和长度的一套DICOM元要素。

数据集是由一系列数据元素组成。每个数据元素都有唯一的标记符,这些数据元素在数据集中按标记符中的组号以及元素号数值增加的方式进行存放。一个数据元素在数据集内至多只能出现一次。但是在嵌套的数据集中可以再次出现。显式和隐式数值表示法在数据集精确嵌套数据集中并不同时存在,一个数据集是否使用显式或隐式数值表示法以及其它特性,取决于传输语法的协商。

一个数据元素包含了数据元素标记符、值表示法、值长度和数据元素值。数据元素的值表示法是否存在决定于协商的传输语法。对隐式值表示法的传输语法,数据元素没有值表示法。而在显式值表示法的传输语法下,数据元素包括值表示法。数据元素有标准数据元素和私有数据元素两种类型。标准数据元素具有偶数值组号,私有数据元素具有奇数组号,自DICOM 3.0以后,数据组号并不传递任何语义上的含义。数据元素中值域的字节长度必须是偶数个,不足的部分填充空格[3]。

标记符(Tag)用4字节的16进制数表示,前面2字节的数是数据元素的组号,后面2字节的数是元素号。组号为偶数的是标准数据元素,具体含义可以在DICOM的数据字典中查到。DICOM的数据字典定义了许多数据元素标记符,涵盖了大多数的应用需要。组号为奇数的为私有数据元素,由用户在使用过程中自己定义。在DICOM标准中每个数据元素都有一个唯一的标记符,这些标记符可以在数据字典中查到。例如:(0x0028 0010) 表示存储图像高度的数据元素的标记符,(0x0028 0011) 表示存储图像宽度的数据元素的标记符,(0x0028 1050) 表示存储图像窗位的数据元素的标记符,(0x0028 1051) 表示存储图像窗宽的数据元素的标记符,(0x7FE0 0010) 表示存储图像像素值的数据元素的标记符。

值表示法(value representation, VR)是数据元素值的表示方法,DICOM标准中,对每个属性都定义了值表示法。值表示法具体描述了属性值如何进行编码。值表示法有隐式和显式这两种形式。隐式就是采用预先规定的表示方法,通过标记符从数据字典中查到DICOM对这个属性表示方法的规定,从而正确解释属性值的内容。显式是用两个字符明确表示值的表示方法,如AE表示应用实体,AS表示年龄字符串,DT是日期和时间,FD表示双精度浮点数等。值表示法的知识是信息交换双方所共享的。对某个属性(以标记符标识)的解码和编码过程必须仔细选择正确的值表示法。共享这个信息有两种可能的方法:共享包含所有可能属性的数据字典,或把值表示法作为数据元素的一部分。后一种方法增加了信息交换的开销,但比用共享数据字典更灵活,尤其在多制造商环境,数据字典同步更新很困难。值长度表示数据元素值所占据的字节数。数据元素值是数据元素值域中所存储的数值。图1是一个具体的数据元素示例。

图1 存储图像高度的数据元素

图1中,(0x0028 0010) 表示存储图像高度的数据元素的标记符,US表示数据元素值是按无符号短整型数存储的,2表示数据元素值占据两个字节,0x0100表示图像的高度是256。

根据DICOM文件结构的特点,在VC++开发环境下,我们可以利用C语言中的While语句和Switch语句读取文件信息。部分C/C++源代码如下:

fseek(fp,128,SEEK_CUR);

if(fread(&nDICMFlag, sizeof(int), 1, fp)!=1)

{

AfxMessageBox("Read dicom file header error");

return false;

}

else

{

if(nDICMFlag!=0x4d434944) //DICM

{

AfxMessageBox("Not surport image format(dicom) ");

return false;

}

}

while(fread(&usTag, sizeof(short), 1, fp) == 1)

{

switch(gTag)

{

case 0x0002:

if(fread(&usTag, sizeof(short), 1, fp) == 1)

switch(eTag)

{

case 0x0010: // Transfer syntax UID

if(readTransfSyntaxStr(fp, sTransfSyntaxUID,

false, nDataEndian) == 0)

if(!strcmp(sTransfSyntaxUID, "1.2.840.10008.1.2.2"))

{

bImplicitVR = FALSE;

nDataEndian = BIG_ENDIAN;

}

break;

case 0x0028:

if(fread(&usTag, sizeof(short), 1, fp) == 1)

{

if (nDataEndian == BIG_ENDIAN)

SwapWord((char *) &usTag, 1);

eTag=usTag & 0xffff;

}

switch(eTag)

{

case 0x0010:

nRows=readWHCIS(fp,bImplicitVR,nDataEndian, nOffBytesOut,nValLenOut);

break;

1.2.2DICOM 图像的显示 通常使用的电脑显示器由于动态范围有限,并受到操作系统的限制,对于灰度图像所能显示的最大灰度值是8bit。而DICOM格式图像的最大灰度值通常不低于12bit,利用普通的电脑显示器难以直接显示全部灰度信息。因此,必须通过开窗显示技术,在不影响视觉效果的前提下将DICOM图像的较大范围内的灰度值逐段映射为0~255灰度范围来显示。概括来说,开窗显示就是在高精度医学图像的较大灰度范围内开设一个窗口,将这个窗口范围内的灰度值映射为0~255范围内的灰度值来显示,并通过不断地调节窗宽和窗位将所有的DICOM图像信息逐段显示出来,同时也可以通过调节窗宽和窗位将医学图像的最佳诊断信息在电脑显示器上显示出来[5]。开窗显示的部分C/C++源代码如下:

for(n=0;n

{

for(k=0;k

{ nGonk=*(pnImgBufIn+k+n*nWidth);

if(nGonk <=nLowVal)

{

nGwnk=0;

}

else if(nGonk >=nHighVal)

{

nGwnk=255;

}

else

{

nGwnk=(int)(( nGonk -nLowVal)*(255.0/nWindowWidth));

}

*( m_lpWindowShowBufOut +3*k+n*nRowBytes)=nGwnk;

}

}

2 结 果

利用C/C++语言在VC++开发环境下进行编程实现了图像的读取与显示,图2是DICOM医学图像开窗显示的部分实验结果,图中,图像(a)的窗位是600,窗宽是255, (b)的窗位是1014,窗宽是255,图像 (c)的窗位是1014,窗宽是350, (d)的窗位是1014,窗宽是2430。

(a)

(b) (c) (d)

3 讨 论

从图2的实验结果可以看出,在窗宽一定的情况下,通过改变窗位能够将DICOM图像的信息按一定的灰度范围逐段显示出来,窗位对应医学图像的亮度,窗位越小,图像越亮,窗位越大,图像越暗,通过改变窗位可以改变图像的亮度。可以看出,在窗位一定的情况下,通过改变窗宽能够将DICOM图像的信息在某个信息点进行压缩和展开,窗宽对应图像的对比度,窗宽越大,图像的对比度越小,窗宽越小,图像的对比度越大,通过改变窗宽,可以改变图像的对比度。不同的窗位和窗宽显示了不同灰度范围的图像信息,只有选择合适的窗位和窗宽才能显示出最佳的图像诊断信息。由于DICOM格式图像文件不同于普通的图像文件,具有特殊的结构特点,读取和显示这类图像文件,必须采用不同于普通图像的编程方法,才能获得较好的效果。

[1] 贾克斌.数字医学图像处理、存档及传输技术[M].北京:科学出版社,2006,20-25.

[2] 王世刚,李月卿,王昌元.DICOM图像到BMP图像转换[J]. 泰山医学院学报,2007,8(4):269-271.

[3] DICOM 2009,. ftp://ftp.nema.org/ medical/dicom.

[4] 田捷,包尚联,周明全.医学图像处理与分析[M].北京:电子工业出版社,2003.

[5] 姜睿智,岳秀艳,史廷春,等. 基于DCMTK的DICOM医学图像显示及其调窗方法[J].计算机系统应用,2009,5:182-185.

猜你喜欢

表示法字节灰度
采用改进导重法的拓扑结构灰度单元过滤技术
No.8 字节跳动将推出独立出口电商APP
基于灰度拉伸的图像水位识别方法研究
No.10 “字节跳动手机”要来了?
否定意义的四种特殊表示法
简谈MC7字节码
基于最大加权投影求解的彩色图像灰度化对比度保留算法
从一道小题联想到的整数表示法
基于灰度线性建模的亚像素图像抖动量计算
名词易错点透视