前言:本站为你精心整理了DICOM医学技术及DIB显示范文,希望能为你的创作提供参考价值,我们的客服老师可以帮助你提供个性化的参考范文,欢迎咨询。
1dicom文件的读取
DICOM文件的读取就是读取DICOM的某些数据元素,从而获得显示DICOM文件所需要的必要信息和图像的数据,如读取传输语法(Transfersyntax),就可以获得VR显式还是隐式,字节排序格式,图像数据的压缩格式等信息;读取像素抽样值(SamplesperPixel),每抽样值位分配(BitsAllocated),行数,列数,实际存储像素的位数(BitsStored)、帧数、位深、符号标志、窗宽、窗位等。当然还可以获得其他一些信息,如查询等信息,本文在此不再展开。读取数据元素并获得数据元素中存储的值时,应根据传输语法的规定,获得数据的隶属类型,字节排列格式,并对数据进行相应处理。
2数据的转换处理
DICOM读取来的图像数据,如果每抽样值位分配(BitsAllocated)大于8,此时以字为单位存储图像数据的像素抽样值,要想显示DICOM图像文件,必须进行数据转换处理,数据转换处理过程依次为高低字节交换,高位截取,重调整。当每抽样值位分配(BitsAllocated)大于8,也就是一个像素抽样值需要高于8位才能表示,以一个字为单位存储像素的抽样值,会由于传输语法中规定的字节排列格式不同,而产生字存储的数据表达的意义不同,同时还会出现16位(一个字)中可能真正表示像素值的要少于16位。以CT为例,在DICOM文件中,CT图像的(SamplesperPixel)为1,也就是只需要一个像素抽样值来表示像素,而每像素抽样值由12位来表示,此时16位中真正存储像素值的只占12位,那么想正确显示CT图像,就需要根据字节排列格式重新调整字节排列,同时将多余的4位去掉。
(1)高低字节交换传输语法规定了DICOM文件中字节的排列格式,如果字节的排列格式BIG_ENDIAN并且每抽样值位分配(BitsAllocated)大于8位(一个字节)时,需要将以字为单位存储的图像数据进行高低字节转换,既将16位(一个字)前8位和后8位互换位置;否则不进行高低字节交换处理。
(2)高位截取由于DICOM文件常用2个字节存储图像数据像素值,但是很多图像格式实际每像素所用位数可能少于16位(如CT为12位),所以从DICOM文件中读取来的数据不能进行直接显示,必须经过预先处理,提取实际的像素数据,将高位数据进行截取。截取时,从标号为(0028H,0102H)的数据元素中获取最高位(HighBit)信息,从(0028H,0101H)数据元素中获得实际存储像素位数(BitsStored),就可以知道每像素所占位数,然后截取高位,得到最终的像素值。截取时,如果是无符号,则直接获得低nHeight+1位所表示的整数,前面位数补零,否则对这个数按2取余。假设当前以nHeight表示最高位数值,并且最高位(HighBit)=实际存储像素位数(BitsStored)-1,此时高于第nHeight的数位与图像数据无关,几乎可以不用考虑,即高15-nHeight位根本不用考虑,只看低nHeight+1位,如果是无符号,则直接获得低nHeight+1位所表示的整数,否则对这个数按2求补。
(3)DICOM文件中特殊图像格式的数据重调整该过程单对某些特殊图像进行的处理,用来将DICOM文件里存储的数值与实际有意义的值之间做一个线性变换,使获得的数值具有实际的意义。以CT图像为例,必须将DICOM文件中获得的像素值先转换成Hounsfield值,再做窗宽窗位调整。因为在DICOM文件中,CT图像需要12位来存储,但是一般CT值的范围在-1000~+32768之内变化,不便于存储,需要将其通过线形变换到一个便于存储的数据范围。所以当进行DICOM文件读取时,需要将存储数据反变换为实际有意义的数据。对于一般的图像,可以直接将从DICOM文件中获得的数据进行调窗处理,但是对于某些特殊的图像(CT等),首先需要将获得的图像数据进行重新调整,然后才能进行窗宽窗位处理。在(0028H,1052H)和(0028H,1053H)数据元素中分别存储fRescaleIntercept和fRescaleSlope的值,相当于截距和斜率,重新调整根据如下公式:HU=pixel_value*fRescaleSlope+fRescaleIntercept。这种线形调整仅对某些格式图像有意义,例如CT图像,PET有时也用到它们,但是其他格式的图像中(0028H,1052H)和(0028H,1053H)两个数据元素的值分别为0和1;对CT而言,CT值是从-1024开始的,所以这两个值也可以为负值。
(4)数据备份对经过上面(1)、(2)、(3)步调整的数据进行备份保存。在对图像的处理过程中,由于医生对于感兴趣区域的变化,以及先前得到的窗宽窗位可能并不是最佳显示,所以就需要不断的去调整窗宽窗位,而每次调窗处理都必须重新获得原来备份数据,然后再去进行调整,所以在每次调窗前,必须先备份原始数据。
3调窗处理(窗宽窗位调整)
所谓调窗处理(C/W),原理上是根据预知的窗宽和窗位值,获得需要显示的窗口大小(窗宽)和中心位置(窗位),从而将窗口内的值转换成显示时的最亮和最暗范围内的值,高于窗口灰度范围的部分置为最亮,低于窗口灰度范围的部分置为最暗。其中:V为图像数据,G为显示器的显示值,为显示器的最大显示值,W为窗宽,C为窗位。调窗处理中,窗宽(Windowwidth)是指需要显示图像的范围,调节窗宽主要影响对比度,窗宽越大,图像灰度层次多,组织对比减少,细节显示差,而窗位(windowlevel)也称窗中心(windowcenter),表征显示区域的中心位置。譬如骨骼的窗宽(C)、窗位(W)分别为C=400,W=2000,那么就可以利用调窗处理,将窗宽调节到骨骼窗宽,窗位调节到骨骼的窗位,然后利用上面的公式将图像V换算成显示器显示值,最终得到的结果是只显示窗口范围内的图像,也就是骨骼,而将窗口范围外的分别置最暗或最亮。
(1)初始窗宽窗位变换当打开一个DICOM时,我们就想立刻看到它的显示,并且想看到图像的较好显示效果,但是当前并不能手动调节窗宽窗位的值,所以就需要获得窗宽和窗位值的一个预先定义值,通过窗宽和窗位来对DICOM文件中读取的数据进行变换,最终显示出来。有两种途径去显示一个动态范围,一种是在DICOM文件中存储了窗宽和窗位值,直接利用窗宽窗位进行变换;另一种方式就是在不知道窗宽窗位值的前提下,通过某些运算得到这两个值。下面就两种途径进行分解说明:(a)如果DICOM文件中未标记窗宽窗位,也就是存储窗宽窗位的数据元素(0028H,1050H)和(0028H,1051H)中的值均为0。此时应该在整个图像内部找到灰度最大值nMax和最小值nMin,设置初始的窗宽(windowwidth)值为nMax-nMin,窗位(windowcenter)为(nMax+nMin)/2,根据下面公式,将最大值和最小值范围内的数据变换到0~255灰度范围内显示。其中nMax和nMin分别表示DICOM图像的灰度最大值和最小值,x为nMin到nMax范围内的某仪灰度值(nMinxnMax),y表示0到255范围内的一个灰度值,通过上面的公式就可以将nMin到nMax范围内的图像灰度值x变换到0到255范围内的灰度值y来显示。(b)如果存储窗宽窗位的数据元素(0028H,1050H)和(0028H,1051H)中的值不为0,表明此时DICOM图像提供窗宽窗位数据进行调整,调整的原理与上面相似,只是此时的窗宽窗位直接由(0028H,1050H)和(0028H,1051H)数据元素提供,此时公式(1)就会变为:y=(x-(Level-Width/2•0))×255•0/Width;(2)为了提高精度,可以运用半精度法对窗口范围内的图像数据进行调整。
(2)手动窗宽窗位调整在图像处理工程中,可能会多次进行调窗处理,获得某时候的感兴趣区域的显示,这就需要手动的调整窗宽窗位的值,对动态范围进行显示。(a)获得备份数据上面曾提到,当打开DICOM文件并显示其图像时,都首先根据窗宽窗位来算出一个显示值,最终显示在显示器上,既DICOM文件解析出像素值转换→中间数据(高位截取等)调窗转换→pValue(显示值)生成→bitmap显示,而每一次窗宽窗位调整必须获得中间数据,这样才能达到利用调窗显示不同感兴趣区域的目的,所以对于每次调窗之前需要先备份中间数据。(b)手动调窗获得了备份数据后,通过不断改变窗宽和窗位值,利用公式(3)进行手动调窗。
(3)非线性调窗根据人眼对于灰度的反应是非线性的,对亮色比对暗色敏感性强的特点,获得中间数据(高位修剪/CT值)的最大nMax和最小灰度nMin,然后通过调整gamma值,将x非线性转换为y来显示图像。y=255•0×pow(x/(nMax-nMin),1•0/gamma);如果希望将图像的整个灰度级以不同对比度尽量通过显示设备灰度级显示(PC显示一般为256个灰度级),本文分别利用折线和贝塞尔曲线实现图像灰度级到显示设备灰度级的转换(见图2、图3)。通过人为的拉动曲线,获得从图像灰度到显示器灰度的对应函数,使得对于那些不重要的区域,可以调整曲线,使得变化率很小,这样相当于将较大的区域转换到0~255很小的区域,相反对于感兴趣区域,就尽量使得变换率特别大,这样就可以获得感兴趣区域较大的对比度,同时又保留了一些其他区域的细节信息。
(4)去除白斑(1)和(2)以及(3)的调窗处理后,最终都需要将得到的pValue(显示值),也就是利用公式(1)或(2)或(3)得到的y值,进行上溢(overflow)和下溢(underflow)判断处理,否则会形成白斑。
4图像的DIB显示
在过程3的调窗处理中,无论初始窗宽窗位变换还是手动调窗处理,最终都需要进行图像的显示。由于计算机系统下不能直接支持DICOM医学图像的显示,而DIB显示是计算机中普遍应用的位图文件格式,所以本文以DIB显示DICOM医学图像。在内存中,以DIB显示只需要包含位图信息头(BITMAPIN-FOHEADER),颜色表(RGBQUAD)以及图像数据就可以显示,所以构建DIB数据块结构。本文首先对调窗处理后的pValue(显示值)变换为DIB数据块,然后利用CDib类的Create()函数创建CDib对象,最后显示图像。位图信息头(BITMAPINFOHEADER)颜色表(RGBQUAD)图像数据图9DIB数据块的结构生成DIB数据块:(1)获得数据元素(0028H,0004H)中图像颜色系统(PhotometricInterpolation),如果图像颜色系统为RGB或者YBR格式,则置调色板大小为0,否则调色板大小为sizeof(RGBQUAD)×256,即:4×256=1024,(2)判断调窗处理后每行字节数是否为4的倍数,如果不是4的倍数,则需要在每行末尾补n个0,生成新的数据区。其中n=列数4%,由于调窗前为字存储,调窗后变换为0~255灰度级,为字节存储,即每个像素由一个字节表示,所以调窗处理后图像数据区大小应该为原来的一半,每行字节数就变成了列数。(3)申请DIB数据区,大小为nLength+sizeof(BITMAPINFOHEADER)+4*256+nCols4%*nRows其中nLength为调窗处理后生成的图像数据区的大小(为调窗前数据区的大小);4*256为调色板大小;nCols为列数,nRows为行数,nCols4%*nRows为(2)中补的0的个数。(4)填写bmp头信息(BITMAPINFOHEADER),并将头信息写入DIB数据区;如果调色板不为0,则将颜色表(调色板)写入DIB数据区;将(2)中生成的新的图像数据写入DIB数据区。(5)调用CDib类中的Create()函数生成CDib对象,最后显示图像。
5结束语
本文基于DICOM3•0标准,介绍了DICOM中比较关键的调窗处理技术和dib显示技术,尝试以一些线性以及非线性调窗技术,实现DICOM医学图像数据到显示器设备灰度级的映射,并采用DIB显示技术,实现了DICOM医学图像的计算机显示。本文利用折线和贝塞尔曲线实现非线性调窗,既实现了DICOM医学图像动态范围到显示器灰度级的映射,又保留了一些范围外细节。