Example #1
0
def iterativeBackPropagation(hrImage, lrImages, lrMasks, transforms, H,
                             itermax, interpOrder):

    #Convert LR images to a list of vectors
    y = []
    for i in range(len(lrImages)):
        y.append(
            convert_image_to_vector(lrImages[i]) *
            convert_image_to_vector(lrMasks[i]))

    #Convert HR Image to vector
    x = convert_image_to_vector(hrImage)
    outputImage = nibabel.Nifti1Image(hrImage.get_data(), hrImage.affine)

    #Compute HR mask
    hrMaskSum = np.zeros(hrImage.get_data().shape, dtype=np.float32)
    for i in range(len(lrImages)):
        tmp1 = apply_affine_itk_transform_on_image(input_image=lrMasks[i],
                                                   transform=transforms[i][0],
                                                   center=transforms[i][1],
                                                   reference_image=hrImage,
                                                   order=0)
        hrMaskSum += tmp1.get_data()

    #index = np.nonzero(hrMaskSum)

    for j in range(itermax):

        error = ibpComputeError(x, H, y,
                                nibabel.Nifti1Image(hrMaskSum, hrImage.affine),
                                lrImages, transforms, interpOrder)
        #    #simulation and error computation
        #    hrError = np.zeros(hrImage.get_data().shape, dtype=np.float32)
        #
        #    for i in range(len(lrImages)):
        #      lrError = convert_vector_to_image(H[i].dot(x)-y[i], lrImages[i])
        #      tmp2 = apply_affine_itk_transform_on_image(input_image = lrError, transform=transforms[i][0], center=transforms[i][1], reference_image=hrImage, order=interpOrder)
        #      hrError += tmp2.get_data()
        #
        #    hrError2 = np.zeros(hrImage.get_data().shape, dtype=np.float32)
        #    hrError2[index] = hrError[index] / hrMaskSum[index]
        #
        #filter error map
        from skimage.restoration import denoise_tv_chambolle
        hrError2 = denoise_tv_chambolle(error, weight=5)

        #update hr image and x
        outputImage = nibabel.Nifti1Image(outputImage.get_data() - hrError2,
                                          hrImage.affine)
        nibabel.save(nibabel.Nifti1Image(hrError2, hrImage.affine),
                     'error_iter' + str(j) + '.nii.gz')
        nibabel.save(outputImage, 'ibp_iter' + str(j) + '.nii.gz')
        x = convert_image_to_vector(outputImage)

    return outputImage
Example #2
0
def iterativeBackPropagation(hrImage, lrImages, lrMasks, transforms, H, itermax, interpOrder):

    # Convert LR images to a list of vectors
    y = []
    for i in range(len(lrImages)):
        y.append(convert_image_to_vector(lrImages[i]) * convert_image_to_vector(lrMasks[i]))

    # Convert HR Image to vector
    x = convert_image_to_vector(hrImage)
    outputImage = nibabel.Nifti1Image(hrImage.get_data(), hrImage.affine)

    # Compute HR mask
    hrMaskSum = np.zeros(hrImage.get_data().shape, dtype=np.float32)
    for i in range(len(lrImages)):
        tmp1 = apply_affine_itk_transform_on_image(
            input_image=lrMasks[i],
            transform=transforms[i][0],
            center=transforms[i][1],
            reference_image=hrImage,
            order=0,
        )
        hrMaskSum += tmp1.get_data()

    # index = np.nonzero(hrMaskSum)

    for j in range(itermax):

        error = ibpComputeError(
            x, H, y, nibabel.Nifti1Image(hrMaskSum, hrImage.affine), lrImages, transforms, interpOrder
        )
        #    #simulation and error computation
        #    hrError = np.zeros(hrImage.get_data().shape, dtype=np.float32)
        #
        #    for i in range(len(lrImages)):
        #      lrError = convert_vector_to_image(H[i].dot(x)-y[i], lrImages[i])
        #      tmp2 = apply_affine_itk_transform_on_image(input_image = lrError, transform=transforms[i][0], center=transforms[i][1], reference_image=hrImage, order=interpOrder)
        #      hrError += tmp2.get_data()
        #
        #    hrError2 = np.zeros(hrImage.get_data().shape, dtype=np.float32)
        #    hrError2[index] = hrError[index] / hrMaskSum[index]
        #
        # filter error map
        from skimage.restoration import denoise_tv_chambolle

        hrError2 = denoise_tv_chambolle(error, weight=5)

        # update hr image and x
        outputImage = nibabel.Nifti1Image(outputImage.get_data() - hrError2, hrImage.affine)
        nibabel.save(nibabel.Nifti1Image(hrError2, hrImage.affine), "error_iter" + str(j) + ".nii.gz")
        nibabel.save(outputImage, "ibp_iter" + str(j) + ".nii.gz")
        x = convert_image_to_vector(outputImage)

    return outputImage
Example #3
0
def iterativeBackPropagation(hrImage, lrImages, lrMasks, transforms, H,
                             itermax):

    y = []
    for i in range(len(lrImages)):
        y.append(
            convert_image_to_vector(lrImages[i]) *
            convert_image_to_vector(lrMasks[i]))

    x = convert_image_to_vector(hrImage)
    outputImage = nibabel.Nifti1Image(hrImage.get_data(), hrImage.affine)

    hrMaskSum = np.zeros(hrImage.get_data().shape, dtype=np.float32)
    for i in range(len(lrImages)):
        tmp1 = apply_affine_itk_transform_on_image(input_image=lrMasks[i],
                                                   transform=transforms[i][0],
                                                   center=transforms[i][1],
                                                   reference_image=hrImage,
                                                   order=0)
        hrMaskSum += tmp1.get_data()

    index = np.nonzero(hrMaskSum)

    for j in range(itermax):

        #simulation and error computation
        hrError = np.zeros(hrImage.get_data().shape, dtype=np.float32)

        for i in range(len(lrImages)):
            lrError = convert_vector_to_image(H[i].dot(x) - y[i], lrImages[i])
            tmp2 = apply_affine_itk_transform_on_image(
                input_image=lrError,
                transform=transforms[i][0],
                center=transforms[i][1],
                reference_image=hrImage,
                order=1)
            hrError += tmp2.get_data()

        hrError2 = np.zeros(hrImage.get_data().shape, dtype=np.float32)
        hrError2[index] = hrError[index] / hrMaskSum[index]

        #update hr image and x
        outputImage = nibabel.Nifti1Image(outputImage.get_data() - hrError2,
                                          hrImage.affine)
        nibabel.save(outputImage, 'ibp_iter' + str(j) + '.nii.gz')
        x = convert_image_to_vector(outputImage)

    return outputImage
Example #4
0
def optimization(HList,x,yList,maxiter,initHRImage):
  #prepare the data for optimization 

  #compress x and H : to perform the optimizaton only on nonzero points (i.e reduce the dimension of the parameter vector)
  index = np.nonzero(x)[0]
  xc = x[index]
  HListc = []
  for i in range(len(HList)):
    HListc.append(HList[i][:,index])

  from skimage.restoration import denoise_tv_chambolle
  HRDenoised = denoise_tv_chambolle(initHRImage.get_data(),weight=10)  
  
  nibabel.save(nibabel.Nifti1Image(HRDenoised,initHRImage.affine),'cham.nii.gz')
  
  xRef = convert_image_to_vector(nibabel.Nifti1Image(HRDenoised, initHRImage.affine))[index]
  
  res = optimize(HListc,xc,yList,maxiter,index,xRef,lambdaL2=0.6)
  #decompress res.x
  x[index] = res  
  return x.reshape(initHRImage.get_data().shape)
Example #5
0
def optimization(HList, x, yList, maxiter, initHRImage):
    #prepare the data for optimization

    #compress x and H : to perform the optimizaton only on nonzero points (i.e reduce the dimension of the parameter vector)
    index = np.nonzero(x)[0]
    xc = x[index]
    HListc = []
    for i in range(len(HList)):
        HListc.append(HList[i][:, index])

    from skimage.restoration import denoise_tv_chambolle
    HRDenoised = denoise_tv_chambolle(initHRImage.get_data(), weight=10)

    nibabel.save(nibabel.Nifti1Image(HRDenoised, initHRImage.affine),
                 'cham.nii.gz')

    xRef = convert_image_to_vector(
        nibabel.Nifti1Image(HRDenoised, initHRImage.affine))[index]

    res = optimize(HListc, xc, yList, maxiter, index, xRef, lambdaL2=0.6)
    #decompress res.x
    x[index] = res
    return x.reshape(initHRImage.get_data().shape)
    #Compute H
    HList = []
    for i in range(len(inputImages)):
        HList.append(
            compute_H(inputImages[i], initHRImage, inputTransforms[i],
                      psfList[i], maskImages[i]))

    #Intensity correction To do
    #N4 on initHR
    #local correction
    #New init HR
    if args.bias == True:
        initHRImage_N4 = apply_N4_on_image(initHRImage, shrink_factor=1)

        xN4 = convert_image_to_vector(initHRImage_N4)
        hrN4Data = np.zeros(initHRImage.get_data().shape)
        for i in range(len(inputImages)):
            simu = convert_vector_to_image(HList[i].dot(xN4), inputImages[i])
            im = gaussian_biais_correction(inputImages[i], simu, 5)

            warped = apply_affine_itk_transform_on_image(
                input_image=im,
                transform=inputTransforms[i][0],
                center=inputTransforms[i][1],
                reference_image=initHRImage,
                order=3)
            hrN4Data += (warped.get_data() / np.float32(len(inputImages)))
        initHRImage = nibabel.Nifti1Image(hrN4Data, initHRImage.affine)

    #Compute x
Example #7
0
        m = np.identity(4)
        c = np.array([0, 0, 0, 1])
        inputTransform = (m, c)

    print('Creating mask image using the following padding value:' +
          str(args.padding))
    data = np.zeros(HRimage.get_data().shape)
    data[HRimage.get_data() > args.padding] = 1
    maskHRImage = nibabel.Nifti1Image(data, HRimage.affine)
    print('Percentage of HR masked values : %.2f ' %
          (np.size(np.nonzero(
              (data))) / (1.0 * np.size(data.shape)) * 100.0 / np.size(data)))
    data = np.zeros(LRimage.get_data().shape)
    data[LRimage.get_data() > args.padding] = 1
    maskLRImage = nibabel.Nifti1Image(data, LRimage.affine)
    print('Percentage of LR masked values : %.2f ' %
          (np.size(np.nonzero(
              (data))) / (1.0 * np.size(data.shape)) * 100.0 / np.size(data)))

    HRSpacing = np.float32(np.array(HRimage.header['pixdim'][1:4]))
    LRSpacing = np.float32(np.array(LRimage.header['pixdim'][1:4]))
    psf = compute_psf(LRSpacing, HRSpacing, args.psf)
    H = compute_H(LRimage, HRimage, inputTransform, psf, maskLRImage)

    x = convert_image_to_vector(HRimage)
    maskX = convert_image_to_vector(maskHRImage)
    #Let mask the HR image
    x = x * maskX

    nibabel.save(convert_vector_to_image(H.dot(x), LRimage), args.output)
  else:
    #no transform provided : use identity as transform and zero as center
    m = np.identity(4)
    c = np.array([0, 0, 0, 1])
    inputTransform = (m,c) 

  print('Creating mask image using the following padding value:'+str(args.padding))
  data = np.zeros(HRimage.get_data().shape)
  data[HRimage.get_data() > args.padding] = 1
  maskHRImage = nibabel.Nifti1Image(data, HRimage.affine)
  print('Percentage of HR masked values : %.2f '%( np.size(np.nonzero((data))) / (1.0*np.size(data.shape)) * 100.0 / np.size(data) ) )
  data = np.zeros(LRimage.get_data().shape)
  data[LRimage.get_data() > args.padding] = 1
  maskLRImage = nibabel.Nifti1Image(data, LRimage.affine)
  print('Percentage of LR masked values : %.2f '%( np.size(np.nonzero((data))) / (1.0*np.size(data.shape)) * 100.0 / np.size(data) ) )
  
  HRSpacing = np.float32(np.array(HRimage.header['pixdim'][1:4]))  
  LRSpacing = np.float32(np.array(LRimage.header['pixdim'][1:4]))  
  psf = compute_psf(LRSpacing, HRSpacing, args.psf)
  H = compute_H(LRimage, HRimage, inputTransform, psf, maskLRImage)    
  
  x = convert_image_to_vector(HRimage)
  maskX = convert_image_to_vector(maskHRImage)
  #Let mask the HR image
  x = x*maskX

  nibabel.save(convert_vector_to_image(H.dot(x),LRimage),args.output)

  

Example #9
0
        HRpsf = compute_psf(LRSpacing, HRSpacing, args.psf)
        psfList.append(HRpsf)

    # Compute H
    HList = []
    for i in range(len(inputImages)):
        HList.append(compute_H(inputImages[i], initHRImage, inputTransforms[i], psfList[i], maskImages[i]))

    # Intensity correction To do
    # N4 on initHR
    # local correction
    # New init HR
    if args.bias == True:
        initHRImage_N4 = apply_N4_on_image(initHRImage, shrink_factor=1)

        xN4 = convert_image_to_vector(initHRImage_N4)
        hrN4Data = np.zeros(initHRImage.get_data().shape)
        for i in range(len(inputImages)):
            simu = convert_vector_to_image(HList[i].dot(xN4), inputImages[i])
            im = gaussian_biais_correction(inputImages[i], simu, 5)

            warped = apply_affine_itk_transform_on_image(
                input_image=im,
                transform=inputTransforms[i][0],
                center=inputTransforms[i][1],
                reference_image=initHRImage,
                order=3,
            )
            hrN4Data += warped.get_data() / np.float32(len(inputImages))
        initHRImage = nibabel.Nifti1Image(hrN4Data, initHRImage.affine)