介紹如何在 Python 中使用 SimpleITK 將一張影像中的部分區域擷取出來,變成一張小的影像。
SimpleITK 的 Extract
與 Crop
函數可以將一張影像中的部分區域擷取出來,儲存成一張小的影像。
這裡我們以 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()