<div dir="ltr"><div>Dear list,<br><br></div><div>We have been using RTK to reconstruct some digital breast tomosynthesis images. The reconstruction using BackProjectionImageFilter looks good. The only issue we are having is in specifying the coordinates of the reconstructed volume. The coordinate system is attached and the code we use to reconstruct is below. I expected the origin of the first slice in the reconstructed volume to be at (w,-h/2,offset). What I find is that the reconstructed volume is shifted in the y direction by about half the height (but not exactly). The X position looks correct for this phantom.<br> <br>rtkBackProjectionImageFilter is described as “implementation of the back projection step of the FDK also for <b><u>filtered</u></b>
back projection reconstruction for cone-beam CT images with a circular
source trajectory”. However, I could not find any filtering of data in
the code. Could you please confirm if there is filtering in this code and
what type of filters there are (ramp, Hann etc)? Also, is the difference
with rtkBackProjectionImageFilter that rtkFDKBackProjectionImageFilter
is for cone beam while rtkBackProjectionImageFilter is not?<br><br><br> // Create reconstructed image<br> typedef rtk::ConstantImageSource< FloatImageType > ConstantImageSourceType;<br> ConstantImageSourceType::PointType origin;<br> ConstantImageSourceType::SpacingType spacing;<br> ConstantImageSourceType::SizeType sizeOutput;<br> ConstantImageSourceType::DirectionType direction;<br> direction.SetIdentity();<br><br> sizeOutput[0] = 1890; //1747; //1890; as found in dicom info<br> sizeOutput[1] = 2457; //as found in dicom info<br> sizeOutput[2] = 1; //as found in dicom info<br><br> double offset(26.27); // Gap between detector and sample<br> origin[0] = 171.99; <br> origin[1] = -223/2; //223 is the height of the reconstructed volume<br> origin[2] = offset+0;<br><br> spacing[0] = 0.091; <br> spacing[1] = 0.091;<br> spacing[2] = 1;<br><br> direction [0][0] = -1;<br> direction [0][1] = 0;<br> direction [0][2] = 0;<br> direction [1][0] = 0;<br> direction [1][1] = 1;<br> direction [1][2] = 0;<br> direction [2][0] = 0;<br> direction [2][1] = 0;<br> direction [2][2] = 1;<br><br> ConstantImageSourceType::Pointer constantImageSource = ConstantImageSourceType::New();<br><br> constantImageSource->SetOrigin( origin );<br> constantImageSource->SetSpacing( spacing );<br> constantImageSource->SetSize( sizeOutput );<br> constantImageSource->SetConstant( 0. );<br> constantImageSource->SetDirection(direction);<br><br> const ImageType::DirectionType& direct = constantImageSource->GetDirection();<br><br> std::cout <<"Direction3DZeroMatrix= " << std::endl;<br> std::cout << direct << std::endl;<br><br> std::cout << "Performing reconstruction" << std::endl;<br><br> //BackProjection recontruction (no filtering)<br> typedef rtk::ProjectionGeometry<3> ProjectionGeometry;<br> ProjectionGeometry::Pointer baseGeom = geometry.GetPointer();<br> typedef rtk::BackProjectionImageFilter< ImageType ,ImageType> FDKCPUType;<br> FDKCPUType::Pointer feldkamp = FDKCPUType::New();<br> feldkamp->SetInput( 0, constantImageSource->GetOutput() );<br> feldkamp->SetInput( 1, imageStack);<br> feldkamp->SetGeometry( baseGeom );<br> feldkamp->Update();<br><br><br></div></div>