simpleitk打開dicom文件


 

ITK是一個功能很強大的醫學圖像處理公開庫,搭配VTK用以顯示圖像,可以實現幾乎所有醫學圖像處理的功能需要。ITK通常以C++包進行提供,當然也可以自己編譯為Python包,不過編譯過程比較繁瑣耗時,而且很容易踩坑。但ITK官方進行的Python封裝SimpleITK,則直接可以拿來使用;雖然有部分ITK的功能沒有包含,但已基本夠用了。我們在處理醫學圖像時,使用的基本都是SimpleITK。

本文就簡單總結一下我們在處理這些圖像時的經驗,以便備忘,並為后來者參考。

1.讀取文件

讀取DICOM序列

醫學圖像中一個CT序列包含很多張圖片,即一個case包含許多slice,使用SimpleITK可以直接讀取一個序列,並方便地得到各種參數,將圖像數據轉換成numpy Array:

  1. import SimpleITK as sitk
  2. import numpy as np
  3. reader = sitk.ImageSeriesReader()
  4. dicom_names = reader.GetGDCMSeriesFileNames(case_path)
  5. reader.SetFileNames(dicom_names)
  6. image = reader.Execute()
  7. image_array = sitk.GetArrayFromImage(image) # z, y, x
  8. origin = image.GetOrigin() # x, y, z
  9. spacing = image.GetSpacing() # x, y, z

需要注意的是,SimpleITK讀取的圖像數據的坐標順序為zyx,即從多少張切片到單張切片的寬和高;而據SimpleITK Image獲取的origin和spacing的坐標順序則是xyz。這些需要特別注意。

讀取DICOM單張圖片

可以將一個DICOM序列作為一個整體一次讀入,也可以一張一張地讀入每張切片:

  1. import SimpleITK as sitk
  2. import numpy as np
  3. image = sitk.ReadImage(slice_path)
  4. image_array = sitk.GetArrayFromImage(image) # z, y, x

這里需要注意的除了坐標順序是zyx之外,還需注意,即使讀取單張切片,所得到的結果也是3維的,只不過第一維是1。

讀取mhd文件

涉及DICOM序列時,為了傳輸方便(從上百個dcm文件到一個mhd文件),很多情況下以mhd文件格式進行呈現,不過mhd文件只是一個很小的包含數據信息的文件,同時搭配的通常還有一個二進制的數據文件(格式為raw或zraw等)。使用SimpleITK讀取這種文件也比較方便。

  1. import SimpleITK as sitk
  2. import numpy as np
  3. image = sitk.ReadImage(mhd_path)
  4. image_array = sitk.GetArrayFromImage(image) # z, y, x
  5. origin = image.GetOrigin() # x, y, z
  6. ...

有時候不想整個讀取數據(因為比較大,讀取處理比較慢),想要讀取的只是一些基本信息,比如origin、spacing等等。這時可以只讀取mhd文件,據此獲取信息,讀取方法比較簡單,不再贅述。

2.處理文件

處理DICOM文件主要有插值等操作,可以直接使用SimpleITK(或者說是ITK)的相關函數,並通過pipeline結構進行處理。

插值

    1. import SimpleITK as sitk
    2. reader = sitk.ImageSeriesReader()
    3. dicom_names = reader.GetGDCMSeriesFileNames(case_path) reader.SetFileNames(dicom_names)
    4. image = reader.Execute()
    5. resample = sitk.ResampleImageFilter()
    6. resample.SetOutputDirection(image.GetDirection())
    7. resample.SetOutputOrigin(image.GetOrigin())
    8. newspacing = [1, 1, 1]
    9. resample.SetOutputSpacing(newspacing)
    10. newimage = resample.Execute(image)


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM