Python

Python SimpleITK 影像處理教學:讀取 DICOM 影像序列檔案

介紹如何使用 Python 的 SimpleITK 模組讀取 DICOM 影像序列檔案,查看後設資料(metadata)、轉存為其他格式的三維影像檔案。

這裡我們使用 DICOM Library 所提供的 CT 影像作為示範,除此之外 ORS 的網站上面也有提供許多可用來測試的影像檔案。

首先載入 SimpleITK 模組,並建立 ImageSeriesReader 影像序列讀取器:

import SimpleITK as sitk

# DICOM 影像序列檔案所在目錄
dicom_folder = "/mnt/data/ct_image"

# 建立影像序列 Reader
reader = sitk.ImageSeriesReader()

在一個目錄之中有可能存在多組 DICOM 影像的 Series,我們可以先以 GetGDCMSeriesIDs 取得所有 DICOM 影像的 Series IDs:

# 取得所有 DICOM 影像的 Series IDs
series_ids = reader.GetGDCMSeriesIDs(dicom_folder)
print(*series_ids, sep = "\n")
1.2.826.0.1.3680043.8.1055.1.20111102150758591.96842950.07877442

接著根據 Series ID 取得 DICOM 影像序列的所有檔案名稱(如果該目錄只有一組 DICOM 影像 Series,呼叫 GetGDCMSeriesFileNames 時亦可省路 Series ID):

# 取得指定 Series ID 的 DICOM 影像序列檔案名稱
series_id = "1.2.826.0.1.3680043.8.1055.1.20111102150758591.96842950.07877442"
dicom_filenames = reader.GetGDCMSeriesFileNames(dicom_folder, series_id)
print(*dicom_filenames, sep = "\n")
/mnt/data/ct_image/image-000361.dcm
/mnt/data/ct_image/image-000360.dcm
/mnt/data/ct_image/image-000359.dcm
[略]

設定 DICOM 影像序列檔案名稱:

# 設定 DICOM 影像序列檔案名稱
reader.SetFileNames(dicom_filenames)

如果需要後設資料,要在載入資料之前加上載入的設定:

# 載入後設資料
reader.MetaDataDictionaryArrayUpdateOn()

# 載入私有後設資料
reader.LoadPrivateTagsOn()

載入實際的影像內容:

# 實際讀取影像內容
image = reader.Execute()

檢查影像的尺寸大小:

# 顯示影像大小
size = image.GetSize()
print("Image size: {} x {} x {}".format(size[0], size[1], size[2]))
Image size: 512 x 512 x 361

查看特定影像 slice 的後設資料鍵(key):

# 查看特定影像 slice 的後設資料鍵
slice_num = 0
reader.GetMetaDataKeys(slice_num)
('0008|0005', '0008|0008', '0008|0012', '0008|0013', '0008|0016', '0008|0018', '0008|0020', '0008|0022', '0008|0023', '0008|0030', '0008|0032', '0008|0033', '0008|0060', '0008|1030', '0008|103e', '0010|0010', '0010|0020', '0010|1010', '0018|0010', '0018|0022', '0018|0050', '0018|0060', '0018|0088', '0018|0090', '0018|1030', '0018|1100', '0018|1120', '0018|1130', '0018|1140', '0018|1151', '0018|1152', '0018|1160', '0018|1210', '0018|5100', '0020|000d', '0020|000e', '0020|0011', '0020|0013', '0020|0032', '0020|0037', '0020|0052', '0020|1041', '0020|4000', '0028|0002', '0028|0004', '0028|0010', '0028|0011', '0028|0030', '0028|0100', '0028|0101', '0028|0102', '0028|0103', '0028|1050', '0028|1051', '0028|1052', '0028|1053', '0028|2110', '0028|2112', '0040|0007', '0040|0009', '0040|0254', '0040|1001')

查看特定影像 slice 的後設資料值:

# 查看特定影像 slice 的後設資料值
tag = '0010|0010'
reader.GetMetaData(slice_num, tag)
'Anonymized'

使用 ImageJ 或 Fiji 顯示影像內容:

# 顯示影像
sitk.Show(image, "Dicom Series")
Fiji(ImageJ)

WriteImage 可以根據副檔名,將影像以指定的格式儲存至檔案中:

# 儲存影像
sitk.WriteImage(image, "volume.nrrd")

參考資料:SimpleITKDicomSeriesReadModifySeriesWrite.pyITKExamples

Share
Published by
Office Guide
Tags: DICOMITK

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