介紹如何在 Python 中使用 SimpleITK 讀取 DICOM 影像的後設資料(metadata)。
許多的醫學影像(例如 X 光、斷層掃描、各種顯微鏡影像等)都會以 DICOM 的格式儲存,而附帶的實驗相關資訊也都會儲存在 DICOM 標準的 Tags 中,以下介紹如何從 DICOM 檔案中取出這些資訊。
相關文章:
Python SimpleITK 影像處理教學:基本影像讀取與檢視
Python SimpleITK 影像處理教學:讀取 DICOM 影像序列檔案
Python 使用 Pydicom 讀取、編輯 DICOM 影像檔案教學與範例
讀取 DICOM 後設資料
若要讀取 DICOM 的後設資料,最簡單的作法就是使用 ReadImage 將 DICOM 的內容讀取出來之後,再從 SimpleITK 影像物件中取出需要後設資料:
import SimpleITK as sitk
# 讀取 DICOM 影像
image = sitk.ReadImage("demo.dcm")
# 列出所有的 DICOM Tags
print(image.GetMetaDataKeys())
# 病人姓名(Patient's Name)Tag
tag = '0010|0010'
# 判斷指定的 DICOM Tag 是否存在
if(image.HasMetaDataKey(tag)):
# 讀取指定的 DICOM Tag 值
print(image.GetMetaData(tag))
只讀取 DICOM 後設資料(不讀取影像)
對於比較大型的 DICOM 影像,若我們要只需要後設資料,不需要看實際的影像資料,就可以改用 ImageFileReader 的 ReadImageInformation 只讀取後設資料,可讓讀取速度加快許多:
import SimpleITK as sitk
# 建立 DICOM 的 Reader
file_reader = sitk.ImageFileReader()
file_reader.SetImageIO("GDCMImageIO")
file_reader.SetFileName("demo.dcm")
# 讀取 DICOM 檔案的後設資料(不讀取影像資料)
file_reader.ReadImageInformation()
# 列出所有的 DICOM Tags
print(file_reader.GetMetaDataKeys())
# 病人姓名(Patient's Name)Tag
tag = '0010|0010'
# 判斷指定的 DICOM Tag 是否存在
if(file_reader.HasMetaDataKey(tag)):
# 讀取指定的 DICOM Tag 值
print(file_reader.GetMetaData(tag))
DICOM 序列檔案
若要讀取 DICOM 序列檔案中的後設資料,可以使用 ImageSeriesReader 讀取 DICOM 影像之後,再取出後設資料:
import SimpleITK as sitk
# 取得 DICOM 序列檔案列表
data_directory = 'MR_BRAIN/1.3.12.2.1107.5.2.30.25049.30000007071111324087500000017/1.3.12.2.1107.5.2.30.25049.30000007071110510826500012297'
series_IDs = sitk.ImageSeriesReader.GetGDCMSeriesIDs(data_directory)
series_file_names = sitk.ImageSeriesReader.GetGDCMSeriesFileNames(data_directory, series_IDs[])
# 建立 DICOM 的 Reader
reader = sitk.ImageSeriesReader()
reader.SetFileNames(series_file_names)
# 設定讀取後設資料
reader.MetaDataDictionaryArrayUpdateOn()
reader.LoadPrivateTagsOn()
# 讀取 DICOM 序列檔案
image = reader.Execute()
# 只看第一張 slice
slice_num = 0
# 列出所有的 DICOM Tags
print(reader.GetMetaDataKeys(slice_num))
# 病人姓名(Patient's Name)Tag
tag = '0010|0010'
# 判斷指定的 DICOM Tag 是否存在
if(reader.HasMetaDataKey(slice_num, tag)):
# 讀取指定的 DICOM Tag 值
print(reader.GetMetaData(slice_num, tag))
