介紹如何在 Python 中使用 SimpleITK 讀取 DICOM 影像的後設資料(metadata)。
許多的醫學影像(例如 X 光、斷層掃描、各種顯微鏡影像等)都會以 DICOM 的格式儲存,而附帶的實驗相關資訊也都會儲存在 DICOM 標準的 Tags 中,以下介紹如何從 DICOM 檔案中取出這些資訊。
相關文章:
Python SimpleITK 影像處理教學:基本影像讀取與檢視
Python SimpleITK 影像處理教學:讀取 DICOM 影像序列檔案
Python 使用 Pydicom 讀取、編輯 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[0]) # 建立 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))
參考資料:SimpleITK-Notebooks