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