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