李清美
(泰山醫(yī)學(xué)院附屬泰山醫(yī)院影像中心,山東 泰安 271000)
DICOM(digital imaging and communications in medicine)標(biāo)準(zhǔn)主要涉及到信息系統(tǒng)中最主要也是最困難的醫(yī)學(xué)圖像的成像和通信,可直接應(yīng)用在放射科信息系統(tǒng)(RIS)和圖像存檔與通信系統(tǒng)(PACS)中[1]。它的應(yīng)用促進(jìn)了醫(yī)學(xué)影像設(shè)備之間的互操作性,提供了一種用于醫(yī)學(xué)信息的開放性的數(shù)據(jù)交換標(biāo)準(zhǔn),使得不同廠商生產(chǎn)的影像設(shè)備形成的圖像統(tǒng)一存檔與通訊成為可能[2]。現(xiàn)有的大多數(shù)圖像處理軟件都不能直接讀取和顯示DICOM格式的醫(yī)學(xué)圖像。因此,編程實(shí)現(xiàn)DICOM格式的醫(yī)學(xué)圖像的讀取和顯示在醫(yī)學(xué)圖像處理和臨床應(yīng)用中具有重要意義。本研究首先分析了DICOM格式圖像文件的結(jié)構(gòu),然后給出開窗顯示的理論分析,最后,利用C/C++語言在VC++開發(fā)環(huán)境下編程實(shí)現(xiàn)了DICOM格式醫(yī)學(xué)圖像的讀取和顯示。
1.1材料
泰山醫(yī)學(xué)院附屬醫(yī)院放射科提供的DICOM格式CT圖像100幅,Windows XP 操作系統(tǒng),Microsoft Visual C++6.0 編程軟件。
1.2方法
1.2.1DICOM 圖像文件格式 DICOM格式圖像文件是按照DICOM標(biāo)準(zhǔn)所生成的圖像文件,它有文件元信息和數(shù)據(jù)集組成。文件元信息也叫文件頭,包括封裝數(shù)據(jù)集的識(shí)別信息。文件頭由128個(gè)字節(jié)的文件前言、緊隨4個(gè)字節(jié)的DICOM前綴和文件元要素組成。這個(gè)文件頭將在每個(gè)DICOM文件中出現(xiàn)。文件前言可加以利用,正如應(yīng)用框架或具體的操作所定義的。DICOM標(biāo)準(zhǔn)的這部分對(duì)固定大小的前言不要求任何結(jié)構(gòu)。不需要構(gòu)建成具有標(biāo)簽和一定長度的DICOM數(shù)據(jù)元素。本部分通過提供與許多常使用的電腦圖像文件格式的兼容性,來便利于對(duì)DICOM文件中的圖像數(shù)據(jù)和其他數(shù)據(jù)的訪問。不論文件前言是否包含信息,DICOM文件內(nèi)容應(yīng)該與該部分要求相符合,數(shù)據(jù)集應(yīng)該與文件元信息中指定的SOP(service object pair)類相符合。如果應(yīng)用框架或特殊操作不使用文件前言,所有128字節(jié)都被設(shè)置成00H。當(dāng)所有128字節(jié)不按上述規(guī)定設(shè)置的時(shí)候,目的是幫助識(shí)別前言被使用過了。4個(gè)字節(jié)的DICOM前綴將包含字符串“DICM”,它被當(dāng)作大寫字母利用ISO 8859 GO字符指令進(jìn)行編碼。這4個(gè)字節(jié)前綴沒有被構(gòu)造為具有標(biāo)記符和長度的DICOM數(shù)據(jù)元素。前言和前綴之后是具有標(biāo)記符和長度的一套DICOM元要素。
數(shù)據(jù)集是由一系列數(shù)據(jù)元素組成。每個(gè)數(shù)據(jù)元素都有唯一的標(biāo)記符,這些數(shù)據(jù)元素在數(shù)據(jù)集中按標(biāo)記符中的組號(hào)以及元素號(hào)數(shù)值增加的方式進(jìn)行存放。一個(gè)數(shù)據(jù)元素在數(shù)據(jù)集內(nèi)至多只能出現(xiàn)一次。但是在嵌套的數(shù)據(jù)集中可以再次出現(xiàn)。顯式和隱式數(shù)值表示法在數(shù)據(jù)集精確嵌套數(shù)據(jù)集中并不同時(shí)存在,一個(gè)數(shù)據(jù)集是否使用顯式或隱式數(shù)值表示法以及其它特性,取決于傳輸語法的協(xié)商。
一個(gè)數(shù)據(jù)元素包含了數(shù)據(jù)元素標(biāo)記符、值表示法、值長度和數(shù)據(jù)元素值。數(shù)據(jù)元素的值表示法是否存在決定于協(xié)商的傳輸語法。對(duì)隱式值表示法的傳輸語法,數(shù)據(jù)元素沒有值表示法。而在顯式值表示法的傳輸語法下,數(shù)據(jù)元素包括值表示法。數(shù)據(jù)元素有標(biāo)準(zhǔn)數(shù)據(jù)元素和私有數(shù)據(jù)元素兩種類型。標(biāo)準(zhǔn)數(shù)據(jù)元素具有偶數(shù)值組號(hào),私有數(shù)據(jù)元素具有奇數(shù)組號(hào),自DICOM 3.0以后,數(shù)據(jù)組號(hào)并不傳遞任何語義上的含義。數(shù)據(jù)元素中值域的字節(jié)長度必須是偶數(shù)個(gè),不足的部分填充空格[3]。
標(biāo)記符(Tag)用4字節(jié)的16進(jìn)制數(shù)表示,前面2字節(jié)的數(shù)是數(shù)據(jù)元素的組號(hào),后面2字節(jié)的數(shù)是元素號(hào)。組號(hào)為偶數(shù)的是標(biāo)準(zhǔn)數(shù)據(jù)元素,具體含義可以在DICOM的數(shù)據(jù)字典中查到。DICOM的數(shù)據(jù)字典定義了許多數(shù)據(jù)元素標(biāo)記符,涵蓋了大多數(shù)的應(yīng)用需要。組號(hào)為奇數(shù)的為私有數(shù)據(jù)元素,由用戶在使用過程中自己定義。在DICOM標(biāo)準(zhǔn)中每個(gè)數(shù)據(jù)元素都有一個(gè)唯一的標(biāo)記符,這些標(biāo)記符可以在數(shù)據(jù)字典中查到。例如:(0x0028 0010) 表示存儲(chǔ)圖像高度的數(shù)據(jù)元素的標(biāo)記符,(0x0028 0011) 表示存儲(chǔ)圖像寬度的數(shù)據(jù)元素的標(biāo)記符,(0x0028 1050) 表示存儲(chǔ)圖像窗位的數(shù)據(jù)元素的標(biāo)記符,(0x0028 1051) 表示存儲(chǔ)圖像窗寬的數(shù)據(jù)元素的標(biāo)記符,(0x7FE0 0010) 表示存儲(chǔ)圖像像素值的數(shù)據(jù)元素的標(biāo)記符。
值表示法(value representation, VR)是數(shù)據(jù)元素值的表示方法,DICOM標(biāo)準(zhǔn)中,對(duì)每個(gè)屬性都定義了值表示法。值表示法具體描述了屬性值如何進(jìn)行編碼。值表示法有隱式和顯式這兩種形式。隱式就是采用預(yù)先規(guī)定的表示方法,通過標(biāo)記符從數(shù)據(jù)字典中查到DICOM對(duì)這個(gè)屬性表示方法的規(guī)定,從而正確解釋屬性值的內(nèi)容。顯式是用兩個(gè)字符明確表示值的表示方法,如AE表示應(yīng)用實(shí)體,AS表示年齡字符串,DT是日期和時(shí)間,F(xiàn)D表示雙精度浮點(diǎn)數(shù)等。值表示法的知識(shí)是信息交換雙方所共享的。對(duì)某個(gè)屬性(以標(biāo)記符標(biāo)識(shí))的解碼和編碼過程必須仔細(xì)選擇正確的值表示法。共享這個(gè)信息有兩種可能的方法:共享包含所有可能屬性的數(shù)據(jù)字典,或把值表示法作為數(shù)據(jù)元素的一部分。后一種方法增加了信息交換的開銷,但比用共享數(shù)據(jù)字典更靈活,尤其在多制造商環(huán)境,數(shù)據(jù)字典同步更新很困難。值長度表示數(shù)據(jù)元素值所占據(jù)的字節(jié)數(shù)。數(shù)據(jù)元素值是數(shù)據(jù)元素值域中所存儲(chǔ)的數(shù)值。圖1是一個(gè)具體的數(shù)據(jù)元素示例。
圖1 存儲(chǔ)圖像高度的數(shù)據(jù)元素
圖1中,(0x0028 0010) 表示存儲(chǔ)圖像高度的數(shù)據(jù)元素的標(biāo)記符,US表示數(shù)據(jù)元素值是按無符號(hào)短整型數(shù)存儲(chǔ)的,2表示數(shù)據(jù)元素值占據(jù)兩個(gè)字節(jié),0x0100表示圖像的高度是256。
根據(jù)DICOM文件結(jié)構(gòu)的特點(diǎn),在VC++開發(fā)環(huán)境下,我們可以利用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 圖像的顯示 通常使用的電腦顯示器由于動(dòng)態(tài)范圍有限,并受到操作系統(tǒng)的限制,對(duì)于灰度圖像所能顯示的最大灰度值是8bit。而DICOM格式圖像的最大灰度值通常不低于12bit,利用普通的電腦顯示器難以直接顯示全部灰度信息。因此,必須通過開窗顯示技術(shù),在不影響視覺效果的前提下將DICOM圖像的較大范圍內(nèi)的灰度值逐段映射為0~255灰度范圍來顯示。概括來說,開窗顯示就是在高精度醫(yī)學(xué)圖像的較大灰度范圍內(nèi)開設(shè)一個(gè)窗口,將這個(gè)窗口范圍內(nèi)的灰度值映射為0~255范圍內(nèi)的灰度值來顯示,并通過不斷地調(diào)節(jié)窗寬和窗位將所有的DICOM圖像信息逐段顯示出來,同時(shí)也可以通過調(diào)節(jié)窗寬和窗位將醫(yī)學(xué)圖像的最佳診斷信息在電腦顯示器上顯示出來[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; } } 利用C/C++語言在VC++開發(fā)環(huán)境下進(jìn)行編程實(shí)現(xiàn)了圖像的讀取與顯示,圖2是DICOM醫(yī)學(xué)圖像開窗顯示的部分實(shí)驗(yàn)結(jié)果,圖中,圖像(a)的窗位是600,窗寬是255, (b)的窗位是1014,窗寬是255,圖像 (c)的窗位是1014,窗寬是350, (d)的窗位是1014,窗寬是2430。 (a) (b) (c) (d) 從圖2的實(shí)驗(yàn)結(jié)果可以看出,在窗寬一定的情況下,通過改變窗位能夠?qū)ICOM圖像的信息按一定的灰度范圍逐段顯示出來,窗位對(duì)應(yīng)醫(yī)學(xué)圖像的亮度,窗位越小,圖像越亮,窗位越大,圖像越暗,通過改變窗位可以改變圖像的亮度??梢钥闯?,在窗位一定的情況下,通過改變窗寬能夠?qū)ICOM圖像的信息在某個(gè)信息點(diǎn)進(jìn)行壓縮和展開,窗寬對(duì)應(yīng)圖像的對(duì)比度,窗寬越大,圖像的對(duì)比度越小,窗寬越小,圖像的對(duì)比度越大,通過改變窗寬,可以改變圖像的對(duì)比度。不同的窗位和窗寬顯示了不同灰度范圍的圖像信息,只有選擇合適的窗位和窗寬才能顯示出最佳的圖像診斷信息。由于DICOM格式圖像文件不同于普通的圖像文件,具有特殊的結(jié)構(gòu)特點(diǎn),讀取和顯示這類圖像文件,必須采用不同于普通圖像的編程方法,才能獲得較好的效果。 [1] 賈克斌.數(shù)字醫(yī)學(xué)圖像處理、存檔及傳輸技術(shù)[M].北京:科學(xué)出版社,2006,20-25. [2] 王世剛,李月卿,王昌元.DICOM圖像到BMP圖像轉(zhuǎn)換[J]. 泰山醫(yī)學(xué)院學(xué)報(bào),2007,8(4):269-271. [3] DICOM 2009,. ftp://ftp.nema.org/ medical/dicom. [4] 田捷,包尚聯(lián),周明全.醫(yī)學(xué)圖像處理與分析[M].北京:電子工業(yè)出版社,2003. [5] 姜睿智,岳秀艷,史廷春,等. 基于DCMTK的DICOM醫(yī)學(xué)圖像顯示及其調(diào)窗方法[J].計(jì)算機(jī)系統(tǒng)應(yīng)用,2009,5:182-185. 山東第一醫(yī)科大學(xué)(山東省醫(yī)學(xué)科學(xué)院)學(xué)報(bào)2010年8期2 結(jié) 果
3 討 論