backprojection and forwardprojection about 2D image

Hi. I want achieve NMAR algorithm recently, need to use the rtk.CudaBackProjectionImageFilter and rtk.CudaForwardProjectionImageFilter in 2 d image respectively. But there seems to be some issues with the image dimensions at the moment, so here’s my code:

class RTKWrapper:
def __init__(self, proj_data, geometry, origin, spacing):
    self.projections_source = itk.GetImageFromArray(proj_data, is_vector=False)
    self.projections_source.SetOrigin(origin)
    self.projections_source.SetSpacing(spacing)
    self.projections_source.Allocate()

    extractor = itk.ExtractImageFilter[image_type, image_type].New(Input=self.projections_source)
    extracted_region = self.projections_source.GetLargestPossibleRegion()
    extracted_region.SetSize(2, 1)
    extracted_region.SetIndex(2, 1)
    extractor.SetExtractionRegion(extracted_region)
    extractor.UpdateLargestPossibleRegion()

    self.cuda_input = cuda_type.New()
    self.cuda_input.SetPixelContainer(extractor.GetOutput().GetPixelContainer())
    self.cuda_input.CopyInformation(extractor.GetOutput())
    self.cuda_input.SetBufferedRegion(extractor.GetOutput().GetBufferedRegion())
    self.cuda_input.SetRequestedRegion(extractor.GetOutput().GetRequestedRegion())

    self.reconstruction_source = rtk.ConstantImageSource[cuda_type].New(Origin=origin_tomo, Spacing=spacing_tomo,  Size=size_tomo)

    self.geometry_rec = rtk.ThreeDCircularProjectionGeometry.New()
    self.geometry_rec.AddProjection(geometry['sid'], geometry['sdd'], geometry['gantry_angle'], 
    geometry['proj_offset_x'],  geometry['proj_offset_y'], geometry['out_plane_angle'], 
    geometry['in_plane_angle'], geometry['source_offset_x'],  geometry['source_offset_y'])
    self.back = rtk.CudaBackProjectionImageFilter.New(Geometry=self.geometry_rec)
    self.forward = rtk.CudaForwardProjectionImageFilter.New(Geometry=self.geometry_rec)

def back_projection(self):
    self.back.SetInput(self.reconstruction_source)
    self.back.SetInput(1, self.cuda_input)
    self.back.Update()
    result = itk.GetArrayFromImage(self.back.GetOutput())
return result

An error occurred:
File “main-test.py”, line 125, in init
extractor = itk.ExtractImageFilter[image_type, image_type].New(Input=self.projections_source)
TypeError: Expecting argument of type itkImageF3 or itkImageSourceIF3.
Additional information:
Wrong number or type of arguments for overloaded function ‘itkImageToImageFilterIF3IF3_SetInput’.
Possible C/C++ prototypes are:
itkImageToImageFilterIF3IF3::SetInput(itkImageF3 const *)
itkImageToImageFilterIF3IF3::SetInput(unsigned int,itkImageF3 const *)
What should I do about it? The shape of proj_data is 【 512,512 】

RTK is only implemented for 3D reconstruction. You can do 2D by working on a single slice but, depending on the forward or back projector, you need to add adjacent slices or detector lines as linear interpolation is used. This has been illustrated here and here.

1 Like