剛開接觸dicom時網上可查的資料真是太少了。
在此寫出一些心得和經驗和大家分享,希望罈子裡做dicom的網友能夠得到一些啟發。
目錄:
一 dicom是什嗎?
二 dicom檔案結構
三 如何編寫dicom程式
四 利用開發包開發dicom程式
五 dcmtk使用介紹
一 dicom是什嗎?
dicom全名是醫療數位影像傳輸協定。它是個編碼和資料轉送協議。醫院裡的ct機出來的x光膠片就是遵從這個協議編碼的。當然其他儀器比如核磁共振等等也是如此。平時看到的膠片只是列印出來的dicom檔案的部分資料。ct機所有的操作包括列印、組建檔案、傳輸都要遵從dicom協議。
dicom官方網站在這裡 http://medical.nema.org 。dicom英文協議可以在這裡下載。
中國PACS論壇 http://www.cnpacs.org 這裡有一個專門討論dicom的板塊裡面有很多資料其中有網友翻譯的dicom中文協議。(本文大部分資料都出自這個論壇)
二 dicom檔案結構
就是dicom檔案的結構。
圖中所用軟體是“jdicom”這是一個用java編寫的免費軟體,這個軟體是我作dicom開發不可缺少的參考。它的網址是 http://www.tiani.com 進入網站在菜單research裡面有“jdicom”一項。由於是java軟體需要下載一個“j2re-1_3_1_14-windows-i586-i.exe”網址在這裡 http://java.sun.com/products/archive/index.html 當然“www.tiani.com”也會有相關聯結。
下面引用pacs論壇上總版主JB的一片文章忘記了。
來簡要介紹dicom檔案結構。相信有了上面軟體“jdicom”直接對dicom的觀察和這篇pacs上的文章再加對dicom協議的閱讀後相信對dicom檔案的結構會有一個清晰的瞭解。
以下是文章內容:
DICOM 檔案格式
DICOM 檔案內容在 Part 3 DICOM IOD 裡定義。CT, MR, CR, DR, US, NM, PET, XA 等各有自己的內容定義,由共同的專有的部分 (IE 和 Modules) 組成。
DICOM 檔案內容由兩個部分組成:存參數的 header 和圖點資料 (pixel data)。
header 只描述映像的基本參數:如病人基本資料、檢驗基本資料、系列資料、位置資料等等。
DICOM 的 4 個內容層次:
1. Patient (病人)
2. Study (檢驗)
3. Series (系列)
4. Image (映像)
儘管頭幾層的內容在很多映像裡是相同的,它們在每個影像檔裡都要有。
每一層叫一個 Information Entity,或 IE (從 relational database schema 設計引用而來)。每一層又細分成 Module。每個 Module 裡面的最小單元叫做一個 attribute 或 element。
現在舉個例子:CR 映像 (DICOM Part 3, A.2.3, Table A.2-1
1. Patient IE:
a. Patient Module (參考 C.7.1.1)
2. Study IE:
a. Study Module (參考 C.7.2.1)
b. Patient Study Module (參考 C.7.2.2)
3. Series IE:
a. General Series (參考 C.7.3.1)
b. CR Series (參考 C.8.1..1)
c. General Equipment (參考 C.7.5.1)
4. Image IE:
a. Genrral Image (C.7.6.1)
b. Image Pixel (C.7.6.3)
c. Contrast/bolus (C.7.6.4)
d. CR Image (C.8.1.2)
...
i. SOP Common (C.12.1)
將這些 modules (tables) 裡的所有 elements 都找出來就做成了一個 CR 映像的架構。
要注意的是這些 module 有些是一定要的 (modatory) 有些是使用者選用的 (user)。
到了每個 module 裡 attribute/element 表又有分五類 Type 1, 1C, 2, 2C 和 3。 Type 1 是一定要的,2 也是一定要的但是內容可以是空的。Type 3 則可要可不要。
所以濃縮一下,一個 CR 映像裡的元素 (elements) 也不是太多。
把這些表格展開後,這些 elements 組成一個 dataset。
那麼寫到一個檔案裡或通過網路傳送又是個什麼格式呢?這就要看 Part 5。
一個元素 (element) 的結構是:
1. group tag: 16-bit
2. element tag: 16-bit
3. length (or VR/length): 32-bit
4. data (bytes of length)
對應每一個用到的 element DICOM 標準 Part 6 都定義了一個 group tag 和 element tag。比如說:
patient name: 0x0010, 0x0010
patient ID: 0x0010, 0x0020
...
VR 說的是 element 格式,比如說 patinet name 的 VR 是 PN。格式是 last_name^first_name^middle_name^prefix^surfix。那麼我的英文名字就是: Wang^JB^^Dr.^
往外寫時要做幾個事情:
1. 要把所有元素按 group tage 和 element tag 理一遍 (sort)。從小排到大。
2. 如果是寫 DICOM 介質的 DICOM file 還先寫 128 bytes preamble (一般是空白),加 "DICM", 加 group 2 Meta header。(講到 Part 10 時再細說)
3. 如果 dataset 裡面含有 Sequence elements, sequence 裡面每一個 Item 又是一個 dataset。
[注意]:dicom協議共有15章,其中第三章是“資訊對象定義”,第五章是“資料結構和編碼”,第六章是“資料字典”這幾張比較重要。
img:http://www.vchelp.net/ASP/cdf_pic/200410/reply_1_746525.jpg
三 如何編寫dicom程式
自己編寫dicom很困難,編出來的程式經常會有相容性的問題。
本人提倡用開發包進行dicom程式編寫,但是為了加深對dicom協議的瞭解還是應該嘗試一下至少看一看別人的代碼。
這裡提供兩個程式。這兩個程式都存在相容性的問題,有的dicom檔案會讀不出來。但是作為初學者的參考還是值得一看的。
第一個程式是pacs論壇上的總版主JB所寫(對!還是那個人),“DcmBmp轉換程式.rar”主要是把dicom檔案中的像素資訊轉換成bmp檔案。
第二個程式是一個pacs論壇上的一個網友wakyrei所寫(由於伺服器資料庫檔案以外遭到破壞這個人在pacs論壇上的所有資訊都已經消失的無影無蹤了),“dcm”此程式相當粗燥讀起來需要一定耐心,作者好像根本不懂怎樣使用mfc,不過其中的dicom類還是值得推敲的。
file:http://www.vchelp.net/ASP/cdf_pic/200410/reply_1_746526.rar
四 利用開發包開發dicom程式
開發dicom的工具包有很多,這裡要說的是dcmtk這個開發包是免費全部開發原始碼。
dcmtk開發包的官方網站是 http://www.dcmtk.org 。在左面的DICOM Software中點擊DCMTK一項就進入了dcmtk下載項。這裡有很多連結。只需要下載兩項:
1.DCMTK 3.5.3 - source code and documentation (2004-05-27)
2.DCMTK 3.5.3 - support libraries for Windows
先別忙著解壓,還需要另外一個軟體來產生工程檔案。這個軟體叫cmake。官方網站是這個 http://www.cmake.org 很多醫學相關的開發包像vtk/itk都需要這個軟體來產生工程檔案。
就是cmake開啟dcmtk開發包的樣子。
需要說明的是幾個WITH_*選項就是“2.DCMTK 3.5.3 - support libraries for Windows”解壓出來的東西。點擊兩次configure之後就可以點ok產生工程檔案了。
工程檔案編譯好之後程式會產生很多例子程式可以用來參考。舉個例子:運行dcmdata\apps\Debug\dcmdump.exe這個程式。這是一個解析dicom檔案的程式。如果想開發dicom檔案可以參照這個程式。
調用庫的時候要注意幾個問題:
1.工程設定/cc++/preprocessor/附加元件封裝含路徑。這裡設定標頭檔
2.工程設定/link/input/物件程式庫模組。這裡設定庫檔案。
3.工程設定/link/project option/。這裡設定庫檔案路徑。
4.工程設定/cc++/code generation/Use run-time library。
5.以上幾項需要和例子程式中的設定保持一致。
img:http://www.vchelp.net/ASP/cdf_pic/200410/reply_1_746527.jpg
五 dcmtk使用介紹
由於dcmtk荒茉趍fc下使用。所以需要產生庫之後再調用。
這裡給出兩個程式。
1.利用dcmtk產生的靜態庫。
2.調用靜態庫產生了一個讀dicom目錄檔案的程式。
整個程式都是參考dcmtk裡的例子dcmdump.exe做的
http://www.vchelp.net/ASP/cdf_pic/200410/reply_1_747225.rar