I'm trying to use ITK N4BiasCorrectionFilter for pre-processing in a MONAI U-Net:
class N4ITKTransform(Transform):
def __call__(self,image):
filtered = []
for channel in image["image"]:
# Crea un'immagine ITK dall'array NumPy
inputImage = itk.image_from_array(channel)
# Crea un filtro di correzione del bias field
corrector = itk.N4BiasFieldCorrectionImageFilter()
#corrector.SetInput(inputImage)
# Esegui il filtro
outputImage = corrector.Execute(inputImage)
# Crea un array NumPy dall'immagine ITK
filtered.append(itk.array_from_image(outputImage))
image["image"] = np.stack(filtered)
return image
monai_load = [
LoadImaged(keys=["image","segmentation"],image_only=False,reader=PILReader()),
EnsureTyped(keys=["image", "segmentation"], data_type="numpy"),
AddChanneld(keys=["segmentation","image"]),
#RepeatChanneld(keys=["segmentation"],repeats=2),
RepeatChanneld(keys=["image"],repeats=3),
AsChannelFirstd(keys=["image"], channel_dim = 0),
]
monai_transforms =[
AsDiscreted(keys=["segmentation"],threshold=0.5),
ToTensord(keys=["image","segmentation"]),
]
train_transforms = Compose(monai_load + [N4ITKTransform()] + monai_transforms)
I try to apply these transforms in a check dataset:
check_ds = Dataset(data=train_data, transform=train_transforms)
orig_ds = Dataset(data=train_data, transform=Compose(monai_load))
check_loader = DataLoader(check_ds, batch_size=1)
orig_loader = DataLoader(orig_ds, batch_size=1)
check_data = utils.first(check_loader)
orig_data = utils.first(orig_loader)
But when i run it the main problem seems to be:
"RuntimeError: C:\P\IPP\ITK-source\ITK\Modules\Core\Common\src\itkProcessObject.cxx:1339:
ITK ERROR: N4BiasFieldCorrectionImageFilter(0000019BDBD62A40): Input Primary is required but not set."
RuntimeError: applying transform <__main__.N4ITKTransform object at 0x0000019BF0CB5220>
RuntimeError: applying transform <monai.transforms.compose.Compose object at 0x0000019BF0CB52E0>
How can solve the Input problem?
ITK Python has a different syntax from SimpleITK. Take a look at quick start guide. It should be
outputImage = itk.n4_bias_field_correction_image_filter(inputImage), or something similar to it.