介紹如何在 Python 中以 SimpleITK 這套影像處理工具,進行基本的影像讀取與檢視工作。
相關文章:
Python SimpleITK 影像處理教學:讀取 DICOM 影像後設資料 Metadata
Python SimpleITK 影像處理教學:讀取 DICOM 影像序列檔案
Python 使用 Pydicom 讀取、編輯 DICOM 影像檔案教學與範例
Python SimpleITK 影像處理教學:讀取 DICOM 影像後設資料 Metadata
Python SimpleITK 影像處理教學:讀取 DICOM 影像序列檔案
Python 使用 Pydicom 讀取、編輯 DICOM 影像檔案教學與範例
讀取影像
若要快速以 SimpleITK 讀取影像,可以使用 ReadImage
:
import SimpleITK as sitk # 讀取 DICOM 影像檔案 image = sitk.ReadImage("demo.dcm")
ReadImage
函數支援的影像類型非常多,我們可以用 ImageFileReader
的 GetRegisteredImageIOs
查詢所有支援的影像類型。
# 列出 SimpleITK 支援的影像類型
sitk.ImageFileReader().GetRegisteredImageIOs()
('BMPImageIO', 'BioRadImageIO', 'Bruker2dseqImageIO', 'GDCMImageIO', 'GE4ImageIO', 'GE5ImageIO', 'GiplImageIO', 'HDF5ImageIO', 'JPEGImageIO', 'LSMImageIO', 'MINCImageIO', 'MRCImageIO', 'MetaImageIO', 'NiftiImageIO', 'NrrdImageIO', 'PNGImageIO', 'StimulateImageIO', 'TIFFImageIO', 'VTKImageIO')
若要查詢 SimpleITK 物件的文件,可以使用 help
:
# 顯示 Image 說明文件
help(image)
影像基本屬性
將影像讀入之後,首先檢查影像的維度:
# 影像維度
print(image.GetDimension())
3
接著檢查影像的大小:
# 影像大小
print(image.GetSize())
(70, 70, 50)
影像大小也可以用個別的函數取得:
# 影像大小
print(image.GetWidth())
print(image.GetHeight())
print(image.GetDepth())
70 70 50
檢查影像的像素類型:
# 像素類型
print(image.GetPixelIDValue())
print(image.GetPixelIDTypeAsString())
print(image.GetNumberOfComponentsPerPixel())
2 16-bit signed integer 1
這是影像的一些其他屬性:
# 其他屬性
print(image.GetOrigin())
print(image.GetSpacing())
print(image.GetDirection())
(-108.683353, -142.36992, 569.4) (4.0, 4.0, 4.0) (1.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, -1.0)
存取影像資料
若要讀取影像的像素值,可以使用 GetPixel
函數或是中括號的索引方式:
# 取得像素值 pixel_value = image.GetPixel(0, 0, 0) pixel_value = image[0, 0, 0]
若要更改影像的像素值,則可使用 SetPixel
函數或是中括號的索引方式:
# 更改像素值 image.SetPixel(0, 0, 0, 123) image[0, 0, 0] = 123
若要對影像做進一部處理,可以將影像資料轉為 NumPy 的陣列,再以其他的工具進行處理,而轉出資料的方式有兩種,一種是以深度複製(deep copy)的方式,將完整資料複製一份出來,跟原來的影像完全獨立,而另外一種則是直接取用原影像內的資料:
# 轉為 NumPy 陣列 nda_copy = sitk.GetArrayFromImage(image) # 深度複製(deep copy) nda = sitk.GetArrayViewFromImage(image) # 非深度複製,顯示用
若要將 NumPy 的資料轉為 SimpleITK 的影像,可以使用 GetImageFromArray
:
# 從 NumPy 轉為 SimpleITK 影像
img = sitk.GetImageFromArray(nda)
SimpleITK 與 NumPy 索引順序
SimpleITK 與 NumPy 的資料索引順序剛好是相反的,SimpleITK 是 (x,y,z),而 NumPy 則是 (z,y,x),所以在資料處理與轉換上要注意。
# SimpleITK 與 NumPy 影像大小 print("SimpleITK:", image.GetSize()) print("NumPy:", nda.shape)
SimpleITK: (70, 70, 50) NumPy: (50, 70, 70)
# SimpleITK 索引方式為 (x,y,z) image[22,33,44]
893
# NumPy 索引方式為 (z,y,x) nda[22,33,44]
893
顯示影像資料
若要顯示影像資料,最簡單的作法就是使用 SimpleITK 的 Show
呼叫 ImageJ 來顯示影像:
# 以 ImageJ 顯示影像
sitk.Show(image)
若是 2D 的影像資料,也可以使用 matplotlib 來繪製:
# 以 matplotlib 繪製 2D 影像 import matplotlib.pyplot as plt z_index = 0 slice = sitk.GetArrayViewFromImage(image)[z_index,:,:] plt.imshow(slice) plt.show()
參考資料:SimpleITK Notebooks