張元魯+王超
摘要:DICOM(Digital Imaging and Communications in Medicine)即醫(yī)學(xué)數(shù)字成像和通信,是醫(yī)學(xué)圖像和相關(guān)信息的國際標準(ISO 12052)。它定義了質(zhì)量能滿足臨床需要的可用于數(shù)據(jù)交換的醫(yī)學(xué)圖像格式。對DICOM文件進行解析顯示并對結(jié)果進行發(fā)送接收,之后結(jié)合到移動端實現(xiàn),可對醫(yī)療信息傳輸提供極大便利。
關(guān)鍵詞:DICOM;醫(yī)療;消息解析;文件傳輸
中圖分類號:TP391 文獻標識碼:A 文章編號:1009-3044(2018)02-0017-02
1 背景
DICOM[1]標準涵蓋了醫(yī)學(xué)數(shù)字圖像的采集、歸檔、通信、顯示及查詢等幾乎所有信息交換的協(xié)議;其推出與實現(xiàn),大大簡化了醫(yī)學(xué)影像信息交換的實現(xiàn),推動了遠程放射學(xué)系統(tǒng)、圖像管理與通信系統(tǒng)(PACS)的研究與發(fā)展,并且由于DICOM的開放性與互聯(lián)性,使得與其他醫(yī)學(xué)應(yīng)用系統(tǒng)(HIS、RIS等)的集成成為可能[2]。目前大多數(shù)醫(yī)院使用這種協(xié)議進行數(shù)據(jù)傳輸主要是在電腦端,這在便捷性和時效性上可能會有所欠缺。
本文將對 DICOM 消息構(gòu)造進行分析,通過編程語言實現(xiàn)對 DICOM文件的解析,并對解析完成的結(jié)果進行發(fā)送接收。通過本文中的過程方法可以對DICOM文件實現(xiàn)記錄信息和圖像的顯示和解析傳輸,基于此可進行移動端應(yīng)用的開發(fā),憑借移動端便捷,及時的特點,使醫(yī)療信息傳輸更加有效率[3]。
2 DICOM消息構(gòu)造
DICOM主要的消息構(gòu)造可分為記錄信息和圖像數(shù)據(jù)這兩個部分,各類信息的開頭通過tag聲明。
整體構(gòu)造如下圖所示,先是128字節(jié)的導(dǎo)言部分,這里絕大多數(shù)的DICOM文件都為空。然后是4字節(jié)的前綴‘DICM。之后就是文件元dataelement。
Tag:DICOM中的數(shù)據(jù)字典。Tag由4字節(jié)的16進制數(shù)表示,前2個字節(jié)為組號,后2個字節(jié)為偏移地址,即為元素號。
VR:分為顯式VR和隱式VR。組號是0002的元素都是顯式的。
3 DICOM文件解析與信息顯示
對于DICOM文件的解析與信息顯示大致上可分為四步,前三步是根據(jù)DICOM消息構(gòu)造對DICOM文件進行解析,最后一步是對得到的信息進行顯示。
第一步:跳過128字節(jié)的導(dǎo)言部分,并讀取前綴是否為“DICM”這4個字符,若不是則返回文件格式錯誤,若是則進行文件解析。
dicomFile.BaseStream.Seek(128, SeekOrigin.Begin); //跳過128字節(jié)導(dǎo)言部分
if (new string(dicomFile.ReadChars(4)) != "DICM")
{
MessageBox.Show("沒有dicom標識頭,文件格式錯誤");
return;
}
第二步:讀取文件元dataelement 。讀取所有0002開頭的tag 并根據(jù)(0002,0010)的值確定傳輸語法。文件元tag部分的數(shù)據(jù)元素都是以顯示VR的方式表示的,它的值是字節(jié)碼處理傳輸語法。主要是確定字節(jié)序和VR類型。這些在DICOM標準的第六章[4]中有說明。
switch (VFStr)
{
case "1.2.840.10008.1.2.1\0"://顯示little
isLitteEndian = true;
isExplicitVR = true;
break;
case "1.2.840.10008.1.2.2\0"://顯示big
isLitteEndian = false;
isExplicitVR = true;
break;
case "1.2.840.10008.1.2\0"://隱式little
isLitteEndian = true;
isExplicitVR = false;
break;
default:
break;
}
第三步:讀取普通tag根據(jù)tag值輸出對應(yīng)記錄信息, 直到7fe0,0010 這個存儲圖像數(shù)據(jù)的 dataelement。在前一步已經(jīng)確定了VR是顯示還是隱式。顯示情況下根據(jù)VR 和Len 確定數(shù)據(jù)類型跟數(shù)據(jù)長度直接讀取就可以了。隱式情況下,則需要根據(jù)tag 字典確定它是什么VR再才能讀取。關(guān)于這個字典也在DICOM標準的第六章。
圖2 DICOM文件元部分tag對應(yīng)信息
if (tag.Substring(0, 4) == "0002")//文件頭 特殊情況
{
VR = new string(dicomFile.ReadChars(2));
if (VR == "OB" || VR == "OW" || VR == "SQ" || VR == "OF" || VR == "UT" || VR == "UN")
{
dicomFile.BaseStream.Seek(2, SeekOrigin.Current);
Len = dicomFile.ReadUInt32();
}
else
Len = dicomFile.ReadUInt16();
}
else if (tag == "fffe,e000" || tag == "fffe,e00d" || tag == "fffe,e0dd")//文件夾標簽
{
VR = "**";
Len = dicomFile.ReadUInt32();
}
else if (isExplicitVR == true)//有無VR的情況
{
………………………….
else if (isExplicitVR == false)
{
VR = getVR(tag);//無顯示VR時根據(jù)tag判斷
Len = dicomFile.ReadUInt32();
}
//判斷是否應(yīng)該讀取VF 以何種方式讀取VF
………………………………
第四步:讀取灰度像素數(shù)據(jù)并調(diào)窗以GDI的方式顯示出來。直接按像素從左到右從上到下逐行依次掃描。兩個字節(jié)表示1個像素普通DICOM格式存儲的是16位的灰度圖像,其實有效數(shù)據(jù)只有12位,除去0 所以最高值是2047。比如CT值從-1000到+1000,空氣的密度為-1000水的密度為0 金屬的密度為+1000總共的值為2000
4 文件發(fā)送接收
解析出來的結(jié)果可通過socket通信進行發(fā)送接收,這里把解析出來的結(jié)果分為記錄文件信息和圖像信息分別進行傳輸。發(fā)送端創(chuàng)建一個socket。之后把解析出來的文件讀入內(nèi)存并通過socket傳輸?shù)浇邮斩恕=邮斩吮O(jiān)聽這個socket,當發(fā)送端發(fā)送數(shù)據(jù)時接收,接收完畢后返回接收成功。
5 實驗結(jié)果
實驗環(huán)境:windows10 x64,服務(wù)器為本地模擬。
DICOM文件解析結(jié)果:左側(cè)為解析出來的記錄信息,右側(cè)為解析出來的圖像信息。
可以看到成功解析出了DICOM文件的記錄信息和圖像信息,并將其分別顯示出來。
對比log日志后發(fā)現(xiàn)接收的信息與解析出來的信息一致,發(fā)送接收成功。
6 結(jié)束語
DICOM這個傳輸協(xié)議是在醫(yī)療領(lǐng)域被廣泛應(yīng)用的,現(xiàn)在這個解析系統(tǒng)已經(jīng)基本上實現(xiàn)了這個協(xié)議的解析和發(fā)送接收,接下來需要做得到就是移動端的嵌套,相信這個系統(tǒng)的完整版會對各大醫(yī)院醫(yī)療信息的交換帶來巨大的便利。
參考文獻:
[1] Dicom Standard,Introduction and Overview[EB/OL][2017-09-20]. http://dicom.nema.org/medical/dicom/current/output/html/part01.html.
[2] 尤超. DICOM 文件頭信息讀取及解析[J]. 微型電腦應(yīng)用, 2012, 28(9):39-44.
[3] 蔣君, 龐樹茂, 馮前進. 醫(yī)學(xué)影像系統(tǒng)的互聯(lián)網(wǎng)應(yīng)用[J]. 中國數(shù)字醫(yī)學(xué), 2016, 11(7):17-19.
[4] Dicom Standard,Data Dictionary[EB/OL][2017-10-02]. http://dicom.nema.org/medical/dicom/current/output/html/part06.html.endprint