免費工具

DCMTK:DICOM ToolKit 安裝與使用教學與範例

介紹如何在 Ubuntu Linux 中安裝與使用 DCMTK(DICOM ToolKit)工具,進行 DICOM 影像的檢視、建立、轉換、傳送、接收與儲存等動作。

DCMTK(DICOM ToolKit)是一套開放原始碼的 DICOM 函式庫與工具組,實作了大部分的 DICOM 標準,包含驗證、建立與轉換 DICOM 影像檔案、處理儲存媒體、透過 DICOM 網路傳輸協定收送 DICOM 影像,以及示範用的影像儲存與 Worklist 伺服器。

安裝 DCMTK

若在 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

顯示 DICOM 檔案內容

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
[略]

彩色輸出 DICOM 標籤資訊

dcmdump 若加上 --print-color 參數,就會以彩色的方式輸出 DICOM 標籤,對於閱讀上相當有幫助:

# 彩色輸出 DICOM 標籤資訊
dcmdump --print-color image.dcm
彩色輸出 DICOM 標籤資訊

搜尋 DICOM 標籤

若要搜尋 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 檔案

若要搜尋一個目錄之下所有 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 轉 BMP、PNG、TIFF

若需要將 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

若要將 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

若要將 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 檔

如果要將一般的 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 標籤

若要修改 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 影像

若要縮小 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 指令除了處理影像像素資料之外,也會連同 RowsColumnsPixelSpacing 等 DICOM 標籤一起更新。

Share
Published by
Office Guide
Tags: DICOM

Recent Posts

Python 使用 PyAutoGUI 自動操作滑鼠與鍵盤

本篇介紹如何在 Python ...

9 個月 ago

Ubuntu Linux 以 WireGuard 架設 VPN 伺服器教學與範例

本篇介紹如何在 Ubuntu ...

9 個月 ago

Linux 網路設定 ip 指令用法教學與範例

本篇介紹如何在 Linux 系...

9 個月 ago

Windows 使用 TPM 虛擬智慧卡保護 SSH 金鑰教學與範例

本篇介紹如何在 Windows...

10 個月 ago

Linux 以 Shamir’s Secret Sharing 分割保存金鑰教學與範例

介紹如何在 Linux 中使用...

11 個月 ago

Linux 以 Cryptsetup、LUKS 加密 USB 隨身碟教學與範例

介紹如何在 Linux 系統中...

11 個月 ago