Categories: Python

Python SimpleITK 影像處理教學:Extract、Crop、RegionOfInterest 擷取部分影像

介紹如何在 Python 中使用 SimpleITK 將一張影像中的部分區域擷取出來,變成一張小的影像。

SimpleITK 的 ExtractCrop 函數可以將一張影像中的部分區域擷取出來,儲存成一張小的影像。

原始影像

這裡我們以 Allen Mouse Brain Atlas 老鼠標準腦的影像為範例,先讀取原始影像,並檢查其影像大小、位置與 voxel size 資訊。

import SimpleITK as sitk

# 讀取 Allen Mouse Brain Atlas 影像
image = sitk.ReadImage("atlasVolume/atlasVolume.mhd")
print("Size:", image.GetSize())
print("Origin:", image.GetOrigin())
print("Spacing", image.GetSpacing())
Size: (528, 320, 456)
Origin: (0.0, 0.0, 0.0)
Spacing (25.0, 25.0, 25.0)

顯示影像切面:

import matplotlib.pyplot as plt

# 轉為 NumPy 陣列
nda = sitk.GetArrayViewFromImage(image)

# 顯示影像切面
z_index = 228
slice = nda[z_index,:,:]
plt.imshow(slice)
plt.show()
原始影像切面

Extract 擷取部分影像

Extract 函數可以用來擷取部分的影像,使用時要指定輸入影像來源、擷取影像的大小,以及位於原影像中的位置:

# Extract 擷取部分影像
extractImg = sitk.Extract(
  image,          # 輸入影像
  [200, 200, 0],  # 擷取影像大小
  [300, 50, 228]) # 擷取影像位置
plt.imshow(sitk.GetArrayViewFromImage(extractImg))
plt.show()
部分影像

由於 SimpleITK 的 Extract 無法指定輸出影像類型,所以將其設計為降維擷取(4D 變 3D、3D 變 2D 或 2D 變 2D),如果輸出影像的維度不符合,就會產生類似這樣的錯誤。

itk::ERROR: ExtractImageFilter(000001842BE0F420): Extraction Region not consistent with output image

Crop 擷取部分影像

Crop 函數也可以用來擷取部份影像,不過在參數的指定上跟 Extract不同,Extract 是指定要保留的部份,而 Crop 則是指定要去除的部份。

若將上面的 Extract 範例改為 Crop 版本,就會像這樣:

# Crop 擷取部分影像
cropImg = sitk.Crop(
  image,          # 輸入影像
  [300, 50, 228], # 下方去除寬度
  [image.GetWidth()-500, image.GetHeight()-250, image.GetDepth()-229]) # 上方去除寬度
plt.imshow(sitk.GetArrayViewFromImage(cropImg)[0,:,:])
plt.show()
部分影像

Crop 函數與 Extract 函數另外一個差異就是無法降維,所以輸出影像的維度會等於輸入影像維度。

RegionOfInterest 擷取部分影像

RegionOfInterest 函數擷取影像的方式類似 Extract 函數,不過它不會變更影像的維度。

# RegionOfInterest 擷取部分影像
roiImg = sitk.RegionOfInterest(
  image,          # 輸入影像
  [200, 200, 1],  # 擷取影像大小
  [300, 50, 228]) # 擷取影像位置
plt.imshow(sitk.GetArrayViewFromImage(roiImg)[0,:,:])
plt.show()
部分影像

NumPy 擷取部分影像

我們可以直接使用 NumPy 的陣列操作方式來擷取部份影像:

# NumPy 擷取部分影像
ndaSubImg = nda[228, 50:250, 300:500]
plt.imshow(ndaSubImg)
plt.show()
部分影像

參考資料:SimpleITK Sphinx DocumentationITK discussion forum

Share
Published by
Office Guide
Tags: ITK

Recent Posts

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

本篇介紹如何在 Python ...

9 個月 ago

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

本篇介紹如何在 Ubuntu ...

9 個月 ago

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

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

9 個月 ago

Windows 使用 TPM 虛擬智慧卡保護 SSH 金鑰教學與範例

本篇介紹如何在 Windows...

10 個月 ago

Linux 以 Shamir’s Secret Sharing 分割保存金鑰教學與範例

介紹如何在 Linux 中使用...

11 個月 ago

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

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

11 個月 ago