尤 超
DICOM是美國放射學會和美國電器制造商協會組織制定的,專門用于醫學圖像的存儲和傳輸的標準,它涵蓋了醫學數字圖像的采集、歸檔、通信、顯示及查詢等幾乎所有信息交換的協議,結構化地定義了醫療圖像設備制造廠商的兼容性聲明。
DICOM標準的推出與實現,大大簡化了醫學影像信息交換的實現,并且由于DICOM的開放性與互聯性,使得醫學影像與其它醫學應用系統(HIS、RIS等)的集成成為可能。各類醫學影像圖像,例如心血管造影、超聲、CT、核磁共振等圖像,在醫學分析方面也越來越具有診斷性和借鑒性。如果DICOM圖像在醫院轉診或是醫學研究教育中用來參考、借鑒、瀏覽, 那么對于醫學影像條件不夠成熟的醫院來說,從DICOM文件轉換出來的有損電子圖像文件(例如 JPG),必然會有一些影響,嚴重的甚至會影響醫療診斷結果。而以DICOM文件方式保存的原始醫學圖像,只有借助相關的醫學影像系統或者DICOM設備,才可以進行讀取,對圖像瀏覽用戶群,有著很大的限制。
本文將對DICOM文件頭的組成和內容進行分析,通過程序實現對DICOM文件頭的信息讀取,進而利用所獲得的信息,進一步讀取DICOM文件中的數據集存儲內容。此方法是讀取DICOM文件的基本解析過程,可以將對DICOM文件的讀取,從程序開發商的集成平臺中分離出來,在結合圖像顯示程序之后,作為獨立的DICOM文件讀取程序使用。
DICOM文件,是指按照DICOM標準而存儲的醫學文件,是一種專用存儲格式,后綴為.dcm。它實際上提供了一種封裝方式,將DICOM IOD的一個SOP實例,以數據集的形式封裝在一個文件中,一般由一個DICOM文件頭和一個DICOM數據集合組成。它的組成,如圖1所示:

圖1 DICOM數據集合組成圖
圖中的SOP指服務-對象對(Service-Object Pair), 每個文件包含一個單一的SOP實例,其中包含有一幀或多幀圖像。
存放DCM文件參數的文件頭和圖點數據(pixel data)構成了DCM文件,如圖2所示:

圖2 DCM 文件的DIR 架構
從物理結構上來看,首先是文件元信息的定義,目錄信息,然后是4個內容層次:Patient (病人) 、Study (檢驗) 、Series (系列) 、Image (圖像) 。頭幾層的內容,在很多圖像里是相同的,它們在每個圖像文件里都要有。文件頭描述圖像的基本參數:如病人基本資料、檢驗基本資料、系列資料、以及具有描述圖像的基本參數(幾行、幾列、每點用了幾位、有否壓縮、調色板。
DICOM文件頭(DICOM File Meta Information)又稱為“文件元”,是整個DICOM文件中最復雜的部分,它包含了標識數據集合的各種相關信息,包括病人信息、檢查信息等。每個DICOM文件,都必須包括該文件頭。文件頭的最開始是文件前言,它通常由128個00H字節組成,接下來是DICOM前綴,它是一個長度為4字節的字符串“DICM”,可以根據該值來判斷一個文件是不是DICOM文件。前言和前綴之后是具有標記符和長度的一套DICOM元要素,除它們之外,所有其它的文件頭元素,都必須采用規定的顯示格式編碼,各個數據元素排列的順序,按照標簽數值從小到大的傳輸格式(Little Endian) 編碼,如表1所示:

表1 DICOM文件元信息(部分)
表1列出了DICOM文件頭元信息的部分內容規則,每個文件頭元素的長度必須為偶數,否則應該按照規定補充一個字節。其中UDI稱為“唯一標識符”,它的產生機制是<根>.<后綴>,是用來標識DICOM標準中,各種不同信息對象的字符串,以保證不同國家、地區、生產商生成的標識,可在世界上任何地點,也可與其它生產商生成的標識相互區別。所有(0002,****) 類的標簽都為DICOM所保留。為了兼容后續版本,如果發現文件中有目前尚未規定的 (0002,****)類標簽,則應該忽略它。
要讀懂DCM文件的信息,首先要了解DCM文件中的數據元素組成。數據元素,都是通過(TAG)進行唯一性標識的,即我們看到的8位16進制數,如 (0002,0001),前4位是組號(Group Number),后4位是元素號(Element Number)。
顯式時

Tag(group ,element) VR Value Length Value
隱式時

Tag(group ,element) 00H Value Length Value
標記符(Tag)用4字節的16進制數表示,前面2字節的數是數據元素的組號,后面2字節的數是元素號。組號為偶數的是標準數據元素,具體含義可以在DICOM的數據字典中查到。
VR有顯式和隱式2種方式,當顯式傳輸時,VR有值,當隱式傳輸時,VR無值;另外,組號是0002的元素都是顯式的。
當VR值是OB,OW,OF,SQ,UT或者UN的時候,VR的長度為4字節,由2字節的字符串和2字節的00H組成。當VR值是其他值的時候,VR的長度為2字節,即2字節的字符串。
Value Length的長度是根據VR可變的,共有2種長度,當VR為OB,OW,OF,SQ,UT或者UN的時候長度為4字節。當VR為其他值時,長度為2字節。Value Length表示的是Value的長度,另外,當Data Length的長度不為偶數時,則根據需要添加前綴或者后綴補齊。
本文基于C#進行DCM讀取的設計,首先將一個DCM文件讀入到內存后,按照文件結構順序進行信息獲取。

DICOM文件頭的最開始是文件前言,這部分為128位為空字符,由”0”表示,直接讀取即可,之后讀取文件頭前綴的4個字節,并記錄這個4個字節進行分析,判斷所讀文件是否為DICOM文件,判斷標準是看是否為4字節的大寫字符串“DICM”,通過ASC碼表對應并轉換成16進制就是“4449434D”,只有判斷符合才進一步做分析。

文件頭元素默認的傳輸語法,是隱式值表示法(VR)Little Endian,在這個傳輸語法下,數據元素的格式為組號(2字節)、元素號(2字節)、值長度(4字節)以及值(值長度給出的字節數),所以讀取4字節,是為了將TAG位解析出來,按照Little Endian的規則,2字節的組成方法,是后一位+前一位,例如4字節“02000000”中,按照傳輸語法解析,就是讀取2字節(0200)表示組號為0002,2字節(0000)表示元素號為0000,從而構成了Tag(0002,0000);而后對該數據元素其他部分的解析也按照類似的方法進行。

至此,DICOM文件頭的一條數據元素讀取完成,之后按照上述過程反復讀取文件內的其他數據元素,當全部數據元素讀取完成后,一個DICOM文件頭的信息也就分析出來,包括病人信息、檢查信息等等。第三行即為程序中讀取的內容,如圖3所示:

圖3 第三行讀取的內容
第三行的(02000000554C 0400 A8000000)讀取下來,就是2字節(0200)表示組號為0002,2字節(0000)表示元素號為0000,構成了 Tag(0002,0000);而 0002組號的元素是顯示的,即2字節(554C),轉換成10進制再由ACS碼表知道是UL;2字節(0400)表示長度為4;4字節(A8000000)表示該數據值域為168。需要注意的是,根據DCOM頭元素要求,組號標簽為0002的頭元素中強制要求的有(0002,0000),(0002,0001),(0002,0002),(0002,0003),(0002,0010),(0002,0012),而在其后面組號標簽為其他的數據元素將表示其他的基本信息。
在整個解析過程中可以看到,對DICOM文件頭的編程過程并不困難,大多數是對文件中16進制數據的讀取、轉換、移位、判斷,而關鍵在于,必須清楚的判斷出每條數據元素的傳輸語法類型,不同的傳輸語法,將決定不同的讀取順序,這就要求開發人員必須熟悉并深入了解DICOM文件頭以及數據元素的組成和含義,特別是值表示法和值長度在不同情況下的表示及意義,其中隱式就要采用預先規定的表示方法,通過標記從共享的數據字典中查到DICOM對這個屬性表示方法的規定,而顯式則要用兩個字符明確表示值的表示方法,如AE表示應用實體,AS表示年齡字符串,DT是日期和時間,FD表示雙精度浮點數等,至于值長度在隱式和顯式下也不同,這就需要加強對DICOM文件的學習和理解了。
DICOM文件頭信息的解析,在DICOM文件的讀取過程中占有重要意義,同時結合圖像讀取顯示程序,將文件頭內的成像參數進行顯影和繪制,最終顯示圖像。現在有很多利用 VTK、ITK集成或是用當前主流程序語言設計的像素顯影程序,都已經可以很好的進行像素點描繪,并且在盡可能減少像素缺損的情況下,呈現出圖像的原來面貌。我們可以利用成熟的計算機技術,將兩方面進行統一接口設計和程序實現,將文件頭的讀取與像素集合的繪制,用更便捷開放的技術結合在一起,為醫學影像方面提供廣泛、創新的技術指導和支持。
[1]胡勝文,荊保國,梁玉新, 基于Qt4的DICOM文件數據讀取和圖像顯示[J], 科技信息,2011,(13),818-819.
[2]張翔,陳勝勇, 利用VTK的DICOM圖像的顯示與信息讀取[J], 電腦知識與技術:學術交流, 2011, 7(4),2343-2344.
[3]王旭 翟,紅英, 基于OpenGL的DICOM醫學圖像讀取和顯示[J], 計算機應用,2009,29(B12),126-127,130.
[4]黃旭, DICOM 醫學圖像數據的讀取[J], 計算機時代,2008,(11),46-47.