Python

Python SimpleITK 影像處理教學:基本影像讀取與檢視

介紹如何在 Python 中以 SimpleITK 這套影像處理工具,進行基本的影像讀取與檢視工作。

讀取影像

若要快速以 SimpleITK 讀取影像,可以使用 ReadImage

import SimpleITK as sitk

# 讀取 DICOM 影像檔案
image = sitk.ReadImage("demo.dcm")

ReadImage 函數支援的影像類型非常多,我們可以用 ImageFileReaderGetRegisteredImageIOs 查詢所有支援的影像類型。

# 列出 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

Share
Published by
Office Guide
Tags: DICOMITK

Recent Posts

Python 使用 PyAutoGUI 自動操作滑鼠與鍵盤

本篇介紹如何在 Python ...

1 年 ago

Ubuntu Linux 以 WireGuard 架設 VPN 伺服器教學與範例

本篇介紹如何在 Ubuntu ...

1 年 ago

Linux 網路設定 ip 指令用法教學與範例

本篇介紹如何在 Linux 系...

1 年 ago

Linux 以 Cryptsetup、LUKS 加密 USB 隨身碟教學與範例

介紹如何在 Linux 系統中...

1 年 ago