How to use N4BiasCorrectionFilter with ITK?

55 views Asked by At

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?

1

There are 1 answers

0
Dženan On

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.