SimpleITK是ITK的简化接口,专门用于处理医学影像,在SimpleITK中,图像的概念与我们在计算机视觉中常用的RGB图像差异很大,后者只是一个多维矩阵,是一个数学上的概念,而在SimpleITK中,图像是一种物理实体,图像中的每一个像素都是物理空间中的一个点,不光有着像素值,还有着坐标,间距,方向等概念。本文将介绍python版SimpleITK读取DICOM并从DICOM study中提取需要的序列的方法。
安装
pip install SimpleITK
读取DICOM影像
import SimpleITK as sitk
file = sitk.ReadImage(filepath) file.GetSize()
file.GetOrigin()
file.GetSpacing()
file.GetDirection()
file.GetMetaDataKeys()
pixel_array = sitk.GetArrayFromImage(file)
|
import os import SimpleITK as sitk
path = "/dicom_study_dir"
reader = sitk.ImageSeriesReader() seriesIDs = reader.GetGDCMSeriesIDs(path) dicom_names = reader.GetGDCMSeriesFileNames(path, seriesID[0]) reader.SetFileNames(dicom_names) image = reader.Execute()
|
读取特定序列并保存为NIfTI格式
医学影像处理时,常常需要三维格式的数据,可以利用SimpleITK从DICOM study文件夹中提取需要的序列,并写入NIfTI文件。以下为示例:
import logging import os import SimpleITK as sitk
def get_tag(dcm, key, default_value=''): try: value = dcm.GetMetaData(key).strip() except Exception as e: logging.error(e) value = default_value
return value
def extract_series(study_dir, series_desc): series_ids = sitk.ImageSeriesReader.GetGDCMSeriesIDs(study_dir) for series_id in series_ids: files = sitk.ImageSeriesReader.GetGDCMSeriesFileNames(study_dir, series_id, recursive=False, useSeriesDetails=False) reader = sitk.ImageSeriesReader() reader.SetFileNames(files) try: img = reader.Execute() except RuntimeError as e: if 'The file in the series have unsupported 3 dimensions' in str(e): img = sitk.ReadImage(files[0]) else: logging.error('Error in reading image, dir %s, series id %s, detail message: %s' % (study_dir, series_id, e)) continue dcm = sitk.ReadImage(files[0]) series_description = get_tag(dcm, '0008|103e') if series_description == series_desc: nii_name = str(series_id) + "nii.gz" sitk.WriteImage(img, os.path.join(study_dir, nii_name)) else: continue
|