bigbigbean / N4BiasFieldCorrection

This is N4 bias field correction for MRI
22 stars 7 forks source link

Trying to apply in multiple images #3

Open IsaacLord opened 4 years ago

IsaacLord commented 4 years ago

Im trying to apply N4BiasFieldCorrection on multiple image (more than 100) i just put this code on for loop how with different methods, however i got the following errors. It run on one by one images however in loop i got the errors.

code:

def N4():
    print("N4 bias correction runs.")
    inputImage = sitk.ReadImage("p04.nii.gz")
    # maskImage = sitk.ReadImage("06-t1c_mask.nii.gz")
    maskImage = sitk.OtsuThreshold(inputImage,0,1,200)
    sitk.WriteImage(maskImage, "p04_mask.nii.gz")
    inputImage = sitk.Cast(inputImage,sitk.sitkFloat32)
    corrector = sitk.N4BiasFieldCorrectionImageFilter();
    output = corrector.Execute(inputImage,maskImage)
    sitk.WriteImage(output,"p04.nii.gz")
    print("Finished N4 Bias Field Correction.....")
if __name__=='__main__':
   N4()

Error:

51749 N4BiasFieldCorrectionImageFilter_swigregister = _SimpleITK.N4BiasFieldCorrectionImageFilter_swigregister

RuntimeError: Exception thrown in SimpleITK N4BiasFieldCorrectionImageFilter_Execute: d:\a\1\sitk-build\itk-prefix\include\itk-4.13\itkImageToImageFilter.hxx:241: itk::ERROR: SubtractImageFilter(000001E58DCBF980): Inputs do not occupy the same physical space! InputImage Origin: [8.0516953e+01, -1.3090556e+02, 1.4494916e+02], InputImage_1 Origin: [1.9875000e+01, -2.6875000e+01, 3.1875000e+01] Tolerance: 1.0000000e-06 InputImage Spacing: [1.0000000e+00, 1.0000000e+00, 1.0000000e+00], InputImage_1 Spacing: [2.6875000e+01, 3.1875000e+01, 1.9875000e+01] Tolerance: 1.0000000e-06.

implementation:

First method:

baseDir=os.path.normpath('C:\Bias_Correction\Data')
files=glob('*.nii')

for f in files:
def N4():
print("N4 bias correction runs.")
inputImage = sitk.ReadImage(f)
# maskImage = sitk.ReadImage("06-t1c_mask.nii.gz")
maskImage = sitk.OtsuThreshold(inputImage,0,1,200)
#sitk.WriteImage(maskImage, "p04_mask.nii.gz")

    inputImage = sitk.Cast(inputImage,sitk.sitkFloat32)

    corrector = sitk.N4BiasFieldCorrectionImageFilter();

    output = corrector.Execute(inputImage,maskImage)
    #sitk.WriteImage(output,"p04.nii.gz")

    sitk.WriteImage(outputs, os.path.join(baseDir, f[:3] + '_BC' + '.' + 'nii.gz'))

    print("Finished N4 Bias Field Correction.....")

if __name__=='__main__':
   N4()

second method:

import SimpleITK as sitk
import os
from glob import glob
import nibabel as nib
import numpy as np

baseDir = os.path.normpath('C:\Bias_Correction\Data2')
files = glob('*.nii.gz')
print(files)
for f in files:
# load nii file
print("N4 bias correction runs.")
print(f)

inputImage = sitk.ReadImage(f, sitk.sitkFloat32)
# maskImage = sitk.ReadImage("06-t1c_mask.nii.gz")
maskImage = sitk.OtsuThreshold(inputImage, 0, 1, 200)
# sitk.WriteImage(maskImage, "P1.nii.gz")
print("maskImage")
#sitk.WriteImage(maskImage, os.path.join(baseDir, f[:3] + 'maskimage' + '.' + 'nii.gz'))

CastImage = sitk.Cast(inputImage, sitk.sitkFloat32)
print("CastImage")
corrector = sitk.N4BiasFieldCorrectionImageFilter()
print("corrector")
outputs = corrector.Execute(CastImage, maskImage)
print("outputs")
sitk.WriteImage(outputs, os.path.join(baseDir, f[:3] + '_BC' + '.' + 'nii.gz'))
# sitk.WriteImage(output,"06-t1c_output3.nii.gz")
print("Finished N4 Bias Field Correction.....")
print('_____________________________')
IsaacLord commented 4 years ago

After two image correction in loop i got the following error:

RuntimeError Traceback (most recent call last)

in 19 corrector.SetDebug(True) 20 ---> 21 output = corrector.Execute(inputImage,maskImage) 22 23 sitk.WriteImage( maskImage, os.path.join(baseDir, f[:3]+'_BC' +'.'+ 'nii.gz'))

C:\ProgramData\Anaconda3\lib\site-packages\SimpleITK\SimpleITK.py in Execute(self, *args) 51745 51746 """

51747 return _SimpleITK.N4BiasFieldCorrectionImageFilter_Execute(self, *args) 51748 51749 N4BiasFieldCorrectionImageFilter_swigregister = _SimpleITK.N4BiasFieldCorrectionImageFilter_swigregister

RuntimeError: Exception thrown in SimpleITK N4BiasFieldCorrectionImageFilter_Execute: d:\a\1\sitk-build\itk-prefix\include\itk-4.13\itkImageToImageFilter.hxx:241: itk::ERROR: SubtractImageFilter(000001E58DCBF500): Inputs do not occupy the same physical space! InputImage Origin: [8.0516953e+01, -1.3090556e+02, 1.4494916e+02], InputImage_1 Origin: [2.3951695e+02, -3.4590556e+02, 3.9994916e+02] Tolerance: 1.0000000e-06 InputImage Spacing: [1.0000000e+00, 1.0000000e+00, 1.0000000e+00], InputImage_1 Spacing: [2.1500000e+02, 2.5500000e+02, 1.5900000e+02] Tolerance: 1.0000000e-06

bigbigbean commented 4 years ago

Thanks for your advice. I will change the code later.