1.讀取文件
讀取DICOM序列
醫(yī)學圖像中一個CT序列包含很多張圖片,即一個case包含許多slice,使用SimpleITK可以直接讀取一個序列,并方便地得到各種參數(shù),將圖像數(shù)據(jù)轉(zhuǎn)換成numpy Array:
import SimpleITK as sitk
import numpy as np
reader = sitk.ImageSeriesReader()
dicom_names = reader.GetGDCMSeriesFileNames(case_path)
reader.SetFileNames(dicom_names)
image = reader.Execute()
image_array = sitk.GetArrayFromImage(image) # z, y, x
origin = image.GetOrigin() # x, y, z
spacing = image.GetSpacing() # x, y, z
需要注意的是,SimpleITK讀取的圖像數(shù)據(jù)的坐標順序為zyx,即從多少張切片到單張切片的寬和高;而據(jù)SimpleITK Image獲取的origin和spacing的坐標順序則是xyz。這些需要特別注意。
讀取DICOM單張圖片
可以將一個DICOM序列作為一個整體一次讀入,也可以一張一張地讀入每張切片:
import SimpleITK as sitk
import numpy as np
image = sitk.ReadImage(slice_path)
image_array = sitk.GetArrayFromImage(image) # z, y, x
這里需要注意的除了坐標順序是zyx之外,還需注意,即使讀取單張切片,所得到的結(jié)果也是3維的,只不過第一維是1。
讀取mhd文件
涉及DICOM序列時,為了傳輸方便(從上百個dcm文件到一個mhd文件),很多情況下以mhd文件格式進行呈現(xiàn),不過mhd文件只是一個很小的包含數(shù)據(jù)信息的文件,同時搭配的通常還有一個二進制的數(shù)據(jù)文件(格式為raw或zraw等)。使用SimpleITK讀取這種文件也比較方便。
import SimpleITK as sitk
import numpy as np
image = sitk.ReadImage(mhd_path)
image_array = sitk.GetArrayFromImage(image) # z, y, x
origin = image.GetOrigin() # x, y, z
有時候不想整個讀取數(shù)據(jù)(因為比較大,讀取處理比較慢),想要讀取的只是一些基本信息,比如origin、spacing等等。這時可以只讀取mhd文件,據(jù)此獲取信息,讀取方法比較簡單,不再贅述。
2.處理文件
處理DICOM文件主要有插值等操作,可以直接使用SimpleITK(或者說是ITK)的相關(guān)函數(shù),并通過pipeline結(jié)構(gòu)進行處理。
插值
import SimpleITK as sitk
reader = sitk.ImageSeriesReader()
dicom_names = reader.GetGDCMSeriesFileNames(case_path) reader.SetFileNames(dicom_names)
image = reader.Execute()
resample = sitk.ResampleImageFilter()
resample.SetOutputDirection(image.GetDirection())
resample.SetOutputOrigin(image.GetOrigin())
newspacing = [1, 1, 1]
resample.SetOutputSpacing(newspacing)
newimage = resample.Execute(image)