介紹如何在 Ubuntu Linux 中安裝與使用 DCMTK(DICOM ToolKit)工具,進行 DICOM 影像的檢視、建立、轉換、傳送、接收與儲存等動作。
DCMTK(DICOM ToolKit)是一套開放原始碼的 DICOM 函式庫與工具組,實作了大部分的 DICOM 標準,包含驗證、建立與轉換 DICOM 影像檔案、處理儲存媒體、透過 DICOM 網路傳輸協定收送 DICOM 影像,以及示範用的影像儲存與 Worklist 伺服器。
若在 Ubuntu Linux 中要安裝 DCMTK 工具,可以從官方的套件庫直接安裝:
# 安裝 DCMTK 套件
sudo apt install dcmtk
DCMTK 套件提供了許多工具,我們可以利用以下指令查看有哪些指令工具可以使用:
# 查看 DCMTK 工具集 dpkg -L dcmtk | grep bin
/usr/bin /usr/bin/cda2dcm /usr/bin/dcm2json /usr/bin/dcm2pdf /usr/bin/dcm2pnm /usr/bin/dcm2xml /usr/bin/dcmcjpeg /usr/bin/dcmcjpls /usr/bin/dcmconv [略]
若要查詢特定指令工具的用法,可以查看其線上手冊,例如查詢 dcmconv
指令的用法就可以執行:
# 查詢 dcmconv 指令的用法
man dcmconv
DCMTK 資料集中的 dcmdump
指令可以用來顯示 DICOM 檔案的內容,也就是將所有的 DICOM 標籤(tags)資訊都顯示出來。
# 顯示 DICOM 標籤資訊
dcmdump image.dcm
# Dicom-File-Format # Dicom-Meta-Information-Header # Used TransferSyntax: Little Endian Explicit (0002,0000) UL 230 # 4, 1 FileMetaInformationGroupLength (0002,0001) OB 00\01 # 2, 1 FileMetaInformationVersion (0002,0002) UI =CTImageStorage # 26, 1 MediaStorageSOPClassUID (0002,0003) UI [1.2.826.0.1.3680043.8.1055.1.20111102150758591.03296050.69180943] # 64, 1 MediaStorageSOPInstanceUID (0002,0010) UI =JPEG2000 # 22, 1 TransferSyntaxUID (0002,0012) UI [1.2.826.0.1.3680043.8.1055.1] # 28, 1 ImplementationClassUID (0002,0013) SH [dicomlibrary-100] # 16, 1 ImplementationVersionName (0002,0016) AE [DICOMLIBRARY] # 12, 1 SourceApplicationEntityTitle # Dicom-Data-Set # Used TransferSyntax: JPEG 2000 (Lossless or Lossy) (0008,0005) CS [ISO_IR 100] # 10, 1 SpecificCharacterSet (0008,0008) CS [ORIGINAL\PRIMARY\AXIAL\HELIX] # 28, 4 ImageType (0008,0012) DA [20061012] # 8, 1 InstanceCreationDate (0008,0013) TM [091605.000000] # 14, 1 InstanceCreationTime [略]
dcmdump
若加上 --print-color
參數,就會以彩色的方式輸出 DICOM 標籤,對於閱讀上相當有幫助:
# 彩色輸出 DICOM 標籤資訊 dcmdump --print-color image.dcm
若要搜尋 DICOM 檔案內指定的標籤內容,可以使用 --search
參數來指定要搜尋的標籤:
# 搜尋 0010,0010 這個 DICOM 標籤 dcmdump --search 0010,0010 image.dcm
(0010,0010) PN [Anonymized] # 10, 1 PatientName
我們也可以一次指定多個要搜尋的 DICOM 標籤:
# 搜尋 0010,0010 與 0010,0020 這兩個 DICOM 標籤 dcmdump --search 0010,0010 --search 0010,0020 image.dcm
(0010,0010) PN [Anonymized] # 10, 1 PatientName (0010,0020) LO [0] # 2, 1 PatientID
若要搜尋一個目錄之下所有 DICOM 檔案的標籤內容,可以使用 +sd
參數指定目錄,並加上 --print-filename
顯示每個檔案的名稱:
# 搜尋 series-000001 目錄下所有 DICOM 檔案的 0010,0010 與 0010,0020 標籤 dcmdump +sd series-000001 --print-filename --search 0010,0010 --search 0010,0020
# dcmdump (1/361): series-000001/image-000119.dcm (0010,0010) PN [Anonymized] # 10, 1 PatientName (0010,0020) LO [0] # 2, 1 PatientID # dcmdump (2/361): series-000001/image-000081.dcm (0010,0010) PN [Anonymized] # 10, 1 PatientName (0010,0020) LO [0] # 2, 1 PatientID # dcmdump (3/361): series-000001/image-000212.dcm (0010,0010) PN [Anonymized] # 10, 1 PatientName (0010,0020) LO [0] # 2, 1 PatientID
這行指令對於檢查整個 series 的 DICOM 檔案相當方便。
若需要將 DICOM 檔案轉為一般的圖片檔案,可以使用 dcm2pnm
這個指令工具:
# DICOM 轉 BMP 圖檔 dcm2pnm --write-bmp image.dcm output.bmp # DICOM 轉 PNG 圖檔 dcm2pnm --write-png image.dcm output.png # DICOM 轉 TIFF 圖檔 dcm2pnm --write-tiff image.dcm output.tiff
通常在將 DICOM 影像轉換為一般的圖片檔案時,會套用一些色階轉換演算法,例如套用 min-max 演算法轉換色階:
# 套用 min-max 演算法轉換色階 dcm2pnm --write-png --min-max-window image.dcm minmax1.png
若想要避免極端的離群值影響色階,可以改用以下方式:
# 忽略極端值(最大與最小值),套用 min-max 演算法轉換色階 dcm2pnm --write-png --min-max-window-n image.dcm minmax2.png # 以直方圖估計分布,忽略前後 5% 極端值 dcm2pnm --write-png --histogram-window 5 image.dcm histwin.png
若要將 DICOM 檔案的標籤轉為 JSON 的格式輸出,可以使用 dcm2json
指令:
# 將 DICOM 標籤轉為 JSON 格式
dcm2json image.dcm
{ "00080005": { "vr": "CS", "Value": [ "ISO_IR 192" ] }, "00080008": { "vr": "CS", "Value": [ "ORIGINAL", "PRIMARY", "AXIAL", "HELIX" ] }, [略] "00401001": { "vr": "SH", "Value": [ "A10026177757" ] }, "7fe00010": { "vr": "OB", "InlineBinary": "" } }
若要將 DICOM 檔案的標籤轉為 XML 的格式輸出,可以使用 dcm2xml
指令:
# 將 DICOM 標籤轉為 XML 格式
dcm2xml image.dcm
<?xml version="1.0" encoding="ISO-8859-1"?> <file-format> <meta-header xfer="1.2.840.10008.1.2.1" name="Little Endian Explicit"> <element tag="0002,0000" vr="UL" vm="1" len="4" name="FileMetaInformationGroupLength">230</element> <element tag="0002,0001" vr="OB" vm="1" len="2" name="FileMetaInformationVersion" binary="hidden"></element> <element tag="0002,0002" vr="UI" vm="1" len="26" name="MediaStorageSOPClassUID">1.2.840.10008.5.1.4.1.1.2</element> [略] <element tag="0040,1001" vr="SH" vm="1" len="12" name="RequestedProcedureID">A10026177757</element> <sequence tag="7fe0,0010" vr="OB" card="2" name="PixelData"> <pixel-item len="4" binary="hidden"></pixel-item> <pixel-item len="89124" loaded="no" binary="hidden"></pixel-item> </sequence> </data-set> </file-format>
如果要將一般的 JPEG 或 BMP 等圖片檔案轉為標準的 DICOM 檔案,可以使用 img2dcm
指令,最簡易的轉換方式為:
# 將 JPEG 圖片檔轉為 DICOM 檔案 img2dcm image.jpg output.dcm # 將 BMP 圖片檔轉為 DICOM 檔案 img2dcm -i BMP image.bmp output.dcm
由於這樣的轉換方式並沒有加入任何圖片以外的資訊,所以會採用老舊的 Secondary Capture Image Storage SOP class 來儲存,所有的 type 1 與 type 2 的 DICOM 標籤都會由程式自動產生。
我們也可以加上 -vlp
或 --vl-photo
參數讓 img2dcm
以 VL Photographic Image Storage SOP class 來儲存影像,並以 -k
或 --key
參數指定特定的 DICOM 標籤內容:
# 採用 VL Photographic SOP 儲存影像,並指定 PatientName 內容 img2dcm -vlp -k 'PatientName=Bond^James' image.jpg output.dcm
一個完整的 DICOM 檔案中包含了許多標籤,通常不會逐一指定每一個 DICOM 標籤值,比較常見的做法是從其他既有的標準 DICOM 檔案中讀取 Patient、Study、Series 資訊,將這些資訊當成範本寫入新建立的 DICOM 檔案中,然後再修改少數特定的欄位值:
# 從 template.dcm 讀取 Patient、Study、Series 資訊, # 並設定 PatientName 為 Bond^James img2dcm --series-from template.dcm \ -k 'PatientName=Bond^James' image.jpg output.dcm
若要修改 DICOM 檔案內的特定標籤內容,可以使用 dcmodify
指令,-i
或 --insert
參數可以用來新增 DICOM 標籤:
# 新增 PatientID 標籤 dcmodify -i "PatientID=123" image.dcm # 新增 PatientID 標籤(亦可用十六進位碼指定標籤) dcmodify -i "(0010,0020)=123" image.dcm
若要修改已經存在的 DICOM 標籤,則可使用 -m
或 --modify
參數:
# 修改 PatientID 標籤 dcmodify -m "PatientID=456" image.dcm
若要將既有的標籤移除,可以使用 -e
或 --erase
參數:
# 移除 PatientID 標籤 dcmodify -e "PatientID" image.dcm
若要移除 DICOM 檔案中所有的指定標籤,可以使用 -ea
或 --erase-all
參數:
# 移除 PatientName 標籤 dcmodify -ea "PatientName" image.dcm
若要移除所有的 DICOM 私有標籤(群組編號為奇數),可以使用 -ep
或 --erase-private
參數:
# 移除所有的 DICOM 私有標籤 dcmodify -ep image.dcm
若要為 DICOM 檔案產生各種新的 UID,可以使用以下指令與參數:
# 產生新的 StudyInstanceUID dcmodify --gen-stud-uid image.dcm dcmodify --gst image.dcm # 簡短寫法,作用相同 # 產生新的 SeriesInstanceUID dcmodify --gen-ser-uid image.dcm dcmodify --gse image.dcm # 簡短寫法,作用相同 # 產生新的 SOPInstanceUID,同時更新 MediaStorageSOPInstanceUID dcmodify --gen-inst-uid image.dcm dcmodify --gin image.dcm # 簡短寫法,作用相同
若要縮小 DICOM 的影像解析度,可以使用 dcmscale
指令:
# X 軸縮小為 0.5 倍,Y 軸自動依比例縮放 dcmscale --scale-x-factor 0.5 image.dcm small.dcm # Y 軸縮小為 0.5 倍,X 軸自動依比例縮放 dcmscale --scale-y-factor 0.5 image.dcm small.dcm # X 軸縮小為 256 像素,Y 軸自動依比例縮放 dcmscale --scale-x-size 256 image.dcm small.dcm # Y 軸縮小為 256 像素,X 軸自動依比例縮放 dcmscale --scale-y-size 256 image.dcm small.dcm
dcmscale
指令除了處理影像像素資料之外,也會連同 Rows
、Columns
與 PixelSpacing
等 DICOM 標籤一起更新。