Using ITK in a task type¶
ITK can be used in a task type via SimpleITK if Core.Python.SimpleITK
is installed.
For example Example.Itk.AnisotropicDiffusion
uses SimpleITK.CurvatureAnisotropicDiffusionImageFilter
:
import xfworkerutil
import SimpleITK
worker = xfworkerutil.XFWorkerJob()
inputs = worker.job['inputs']
iterations = inputs['iterations']
time_step = inputs['time_step']
conductance = inputs['conductance']
# Download input files (if not local)
image = worker.get_omni_image(inputs['image'])
# Use ITK for image processing
itk_image = SimpleITK.GetImageFromArray(image.pixels)
anisotropicFilter = SimpleITK.CurvatureAnisotropicDiffusionImageFilter()
anisotropicFilter.SetNumberOfIterations(iterations)
anisotropicFilter.SetTimeStep(time_step)
anisotropicFilter.SetConductanceParameter(conductance)
# Cast the original_image to floating-point
itk_image = SimpleITK.Cast(itk_image, SimpleITK.sitkFloat32)
itk_image = anisotropicFilter.Execute(itk_image)
itk_image = SimpleITK.Cast(itk_image, SimpleITK.sitkInt16)
itk_image_pixels = SimpleITK.GetArrayFromImage(itk_image)
# Save the image
result_omni_path = worker.create_related_path(image.pixels_path, '_itk_diff.omni')
result_raw_path = worker.create_related_path(image.pixels_path, '_itk_diff.raw')
itk_image_pixels.tofile(str(result_raw_path))
result_image = image.save_derived_image(result_omni_path, result_raw_path, {
'pixel_type': 'int16',
})
# Upload output files
result_image_output = worker.upload_omni_output(result_image)
# Save outputs
outputs = {
"image": result_image_output,
}
worker.finish(outputs)