DICOM二進(jìn)制文件解讀的VC++實(shí)現(xiàn)
The analysis and reading of DICOM’s binary file with VC+ +
馮輝
(大連北洋醫(yī)療裝備總公司 遼寧大連 116o2])
【關(guān)鍵詞】醫(yī)學(xué)影像;二進(jìn)制;標(biāo)簽;字節(jié);像素
中圖分類號(hào):R443.8 文獻(xiàn)標(biāo)識(shí)碼:B 文章編號(hào):1006—9011(2003)0r7—0538—01
DICOM(cugit~.瑚a and coramunieation On medicine)文件為
醫(yī)學(xué)影像的專用存儲(chǔ)格式,后綴為.dcm,在CT、磁共振、醫(yī)院
PACS系統(tǒng)中應(yīng)用廣泛。一般的讀圖軟件無(wú)法支持這一圖像
格式。在了解DICOM文件格式的基礎(chǔ)上,編程實(shí)現(xiàn)其二進(jìn)
制文件的讀寫,在醫(yī)學(xué)影像領(lǐng)域是一個(gè)有普遍意義的題目。
筆者在WIN2000的操作系統(tǒng)下,采用VC++6.0編程實(shí)現(xiàn)
其在屏幕上的顯示。寫下此文,希望能起到拋磚引玉與同行
交流的作用。
將文件后綴.dem改為.cpp后,可以用VC讀出其二進(jìn)制
內(nèi)容,為了顯示方便,文件采用十六進(jìn)制顯示,即一個(gè)十六進(jìn)
制位代表4個(gè)二進(jìn)制單位(bit),一個(gè)字節(jié)(byte)由2個(gè)十六
制位構(gòu)成,比如08 oo oo 1O表示4個(gè)字節(jié)的信息。
介紹一下DICOM文件中最重要的概念一標(biāo)簽(tag)結(jié)
構(gòu):DICOM文件中標(biāo)簽是提供有關(guān)圖像信息的單位,一般占
用4個(gè)字節(jié)的空問(wèn),標(biāo)簽后面緊跟的4個(gè)字節(jié)表示標(biāo)簽的內(nèi)
容所占的字節(jié)數(shù)(N),再后面的N個(gè)字節(jié)所表示的值才是標(biāo)
簽的實(shí)際內(nèi)容(這3部分稱為標(biāo)簽單元)。在隱式VR結(jié)構(gòu)
中。標(biāo)簽單元的構(gòu)成如下:
Tag Value(1ength) Value Field
(4 bytes) (4 bytes) (1e~.th bytes)
舉個(gè)例子,假如有如下的一段代碼 墊 !Q
02 oo oo oo 02 O1其中,oo 28 oo 1O為標(biāo)簽,02 oo oo oo表示
它后面的2個(gè)字節(jié)為標(biāo)簽的實(shí)際內(nèi)容,02 Ol即為標(biāo)簽的值o
DICOM文件中主要的標(biāo)簽有如下幾個(gè):
Rows:(0,002S~10) 圖像的行數(shù)
Columns:(0x002S0011) 圖像的列數(shù)
Bits Allocated:(0x002S0100) 表示每個(gè)像素的位數(shù)(bit)
Bits Stored:(o~ty2solo1) 像素的有效位數(shù)
Bits High:(0x00280102) 有效位數(shù)的最高位
fOx7聊0010) 標(biāo)志像素?cái)?shù)據(jù)的起始位置
538
那么,如何用VC實(shí)現(xiàn)標(biāo)簽的查找呢?主要解決的問(wèn)題
是4個(gè)字節(jié)的“讀”和逐個(gè)字節(jié)的“找”之間的矛盾。下面給
出具體的思路:
①用open()函數(shù)打開文件;②用Read()函數(shù)讀出4個(gè)字
節(jié),但注意此時(shí)的指針已經(jīng)移到了第4個(gè)字節(jié)。如果繼續(xù)讀
下去,就成了每4個(gè)字節(jié)讀一次,這樣肯定找不到所需的標(biāo)
簽,因?yàn)闃?biāo)簽單元的長(zhǎng)度并不一定是4的整數(shù)倍。所以必須
實(shí)現(xiàn)逐字節(jié)查找;③用Seek()函數(shù)反向定位3位,即可實(shí)現(xiàn)
上述目的;④注意循環(huán)結(jié)束時(shí),再用sed.()函數(shù)將指針恢復(fù)
原位。因?yàn)樽詈笠淮窝h(huán),指針還向前移動(dòng)了3位;⑤查找
到標(biāo)簽后,讀出后面的4個(gè)字節(jié)(結(jié)果為數(shù)值N),然后再讀出
接著的N個(gè)字節(jié),即得到標(biāo)簽的實(shí)際內(nèi)容;⑥D(zhuǎn)ICOM文件中
存在一個(gè)字節(jié)換位的問(wèn)題,即高兩個(gè)字節(jié)與低兩個(gè)字節(jié)換位
存儲(chǔ),例如要查找標(biāo)簽O0280010,實(shí)際應(yīng)查找00100028。
用以上方法可以找到你所需要的任何標(biāo)簽,具體每個(gè)標(biāo)
簽的含義可參見DICOM的文檔。
讀出標(biāo)簽,得到所需的信息,并通過(guò)(Ox7聊oo1O)定位
好像素?cái)?shù)據(jù)的起始點(diǎn)后,怎樣顯示到屏幕上呢?筆者采用了
SetR ()函數(shù),逐像素繪制圖像。這是繪圖中最基本的操
作,但開銷過(guò)大。朋友們可考慮其它方法。
DICOM文件中,像素?cái)?shù)據(jù)的存儲(chǔ)為從左至右,從上至下。
像素?cái)?shù)據(jù)的結(jié)構(gòu)由以下的三個(gè)標(biāo)簽值來(lái)說(shuō)明,舉例說(shuō)明:
①Bits Al】Dc8t甜:f6表示每個(gè)像素由16bit表達(dá),即2個(gè)字
節(jié);②Bits Stored:10像素的有效位數(shù)為1O位,高六位有其它
用途:③Bits High:9有效位數(shù)的最高位為9,即0到9共1O
位。
知道了標(biāo)簽的含義,處理起來(lái)就簡(jiǎn)單了:每次讀出2個(gè)
字節(jié),去掉高6位,灰度圖RGB分量相等,即可顯示圖像了。
當(dāng)然還有后續(xù)的各種處理,在此就不再贅述了。
DICOM文件的數(shù)據(jù)結(jié)構(gòu)有很多種,本文介紹的只是其中
最簡(jiǎn)單的隱式vR結(jié)構(gòu),標(biāo)簽也有許多。另外,像素?cái)?shù)據(jù)的高
位還含有特定信息,不可輕易舍棄。在此,只是給出一個(gè)簡(jiǎn)
單的思路,希望能對(duì)大家有所啟發(fā)。
(收 |
|