介紹如何在 Python 中使用 ITK 的 StreamingImageFilter
將大型影像自動分割成小區域,以串流分批處理。
在使用 ITK 處理影像資料時,若遇到影像過大、記憶體不足時,可以使用串流(streaming)的方式將資料切割成小區域分批處理,以節省記憶體。
ITK 的 StreamingImageFilter
可以自動將資料區域(region)切割後,讓其之前的資料處理管線(pipeline)都串流方式運作,在 StreamingImageFilter
組合成完整的影像後再進行後續輸出,以下是一個簡單的範例。
import itk # 設定分割數量 numberOfSplits = 4 # 設定影像類型 Dimension = 3 PixelType = itk.US ImageType = itk.Image[PixelType, Dimension] # 讀取 MHA 影像檔案 imageFilename = "input.mha" reader = itk.ImageFileReader[ImageType].New(FileName=imageFilename) # 建立 PipelineMonitorImageFilter 查看 Streaming 每次處理的範圍 monitorFilter = itk.PipelineMonitorImageFilter[ImageType].New() monitorFilter.SetInput(reader.GetOutput()) # 建立 StreamingImageFilter 將資料以 Streaming 分批處理 streamingFilter = itk.StreamingImageFilter[ImageType, ImageType].New() streamingFilter.SetInput(monitorFilter.GetOutput()) streamingFilter.SetNumberOfStreamDivisions(numberOfSplits) # 實際執行 streamingFilter.Update() # 輸出影像完整的 Region 資訊 print('The output LargestPossibleRegion is: ' + str(streamingFilter.GetOutput().GetLargestPossibleRegion())) # 輸出 Streaming 的分批 Region 資訊 updatedRequestedRegions = monitorFilter.GetUpdatedRequestedRegions() print("Updated RequestedRegion's:") for r in range(len(updatedRequestedRegions)): print(' ' + str(updatedRequestedRegions[r]))
The output LargestPossibleRegion is: itkImageRegion3([0, 0, 0], [249, 278, 424]) Updated RequestedRegion's: itkImageRegion3([0, 0, 0], [249, 278, 106]) itkImageRegion3([0, 0, 106], [249, 278, 106]) itkImageRegion3([0, 0, 212], [249, 278, 106]) itkImageRegion3([0, 0, 318], [249, 278, 106])
這裡的影像資料處理流程分為三個部分,首先以 ImageFileReader
讀取影像資料,接著加上一個 PipelineMonitorImageFilter
方便觀察串流分割的實際情況,最後接上 StreamingImageFilter
處理資料分割、產生串流。
除了使用 StreamingImageFilter
建立串流處理流程之外,也可以利用 ImageFileWriter
本身的串流功能,將整個處理流程串流化。
參考資料:ITKExamples、ITK Community