介紹如何使用 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")
WriteImage
可以根據副檔名,將影像以指定的格式儲存至檔案中:
# 儲存影像 sitk.WriteImage(image, "volume.nrrd")
參考資料:SimpleITK、DicomSeriesReadModifySeriesWrite.py、ITKExamples