User talk:Jasminium

From Openrtk
Jump to navigation Jump to search

Welcome to Openrtk! We hope you will contribute much and well. You will probably want to read the help pages. Again, welcome and have fun! Matthew.bowman (talk) 08:45, 25 November 2014 (EST)

Forward Projection (RayCast vs RayBox)

Hi I have a question regarding forward projections. I tried to reconcile RayBox and RayCast Forward Projections but got wrong results from RayCast as soon as I introduce volume rotation. I put the projection output and code below, since projection is analytic, they should coincide.

Has anybody got an idea what went wrong?

Thanks a lot Steve


Projection from RayCast

z: 0

              0:           1:           2:           3:
 0:     166.6788     176.3021     176.3021     166.6788 
 1:     166.0071     175.5859     175.5859     166.0071 
 2:     166.0071     175.5859     175.5859     166.0071 
 3:     166.6788     176.3021     176.3021     166.6788 


Projection from RayBox

z: 0

              0:           1:           2:           3:
 0:      178.787     240.9991     240.9991      178.787 
 1:     178.0665     240.0199     240.0199     178.0665 
 2:     178.0665     240.0199     240.0199     178.0665 
 3:      178.787     240.9991     240.9991      178.787 


void test_forward_projection() {

 const unsigned int Dimension = 3;
 typedef double                                    OutputPixelType;
 typedef itk::Image< OutputPixelType, Dimension > OutputImageType;
 typedef itk::Vector<double, 3>                   VectorType;
 int nProj = 1;

double angular_arc=360; double first_angle=45;

 // Constant image sources
 typedef rtk::ConstantImageSource< OutputImageType > ConstantImageSourceType;
 ConstantImageSourceType::PointType origin;
 ConstantImageSourceType::SizeType size;
 ConstantImageSourceType::SpacingType spacing;
 // The test projects a volume filled with ones. The forward projector should
 // then return the intersection of the ray with the box and it is compared
 // with the analytical intersection of a box with a ray.
 // Create volume input.
 const ConstantImageSourceType::Pointer volInput = ConstantImageSourceType::New();
 origin[0] = -96;
 origin[1] = -96;
 origin[2] = -96;
 size[0] = 4;
 size[1] = 4;
 size[2] = 4;
 spacing[0] = 64.;
 spacing[1] = 64.;
 spacing[2] = 64.;
 volInput->SetOrigin( origin );
 volInput->SetSpacing( spacing );
 volInput->SetSize( size );
 volInput->SetConstant( 1. );
 volInput->UpdateOutputInformation();
 // Initialization Volume, it is used in the forward projector and in the
 // Ray Box Intersection Filter in order to initialize the stack of projections.
 const ConstantImageSourceType::Pointer projInput = ConstantImageSourceType::New();
 size[2] = nProj;
 projInput->SetOrigin( origin );
 projInput->SetSpacing( spacing );
 projInput->SetSize( size );
 projInput->SetConstant( 0. );
 projInput->Update();
 // Forward Projection filter
 typedef rtk::RayCastInterpolatorForwardProjectionImageFilter<OutputImageType, OutputImageType> FPType;
 FPType::Pointer fp = FPType::New();
 fp->InPlaceOff();
 fp->SetInput( projInput->GetOutput() );
 fp->SetInput( 1, volInput->GetOutput() );
 // Ray Box Intersection filter (reference)
 typedef rtk::RayBoxIntersectionImageFilter<OutputImageType, OutputImageType> RBIType;
 RBIType::Pointer rbi = RBIType::New();
 rbi->InPlaceOff();
 rbi->SetInput( projInput->GetOutput() );
 VectorType boxMin, boxMax;
 boxMin[0] = -96.0;
 boxMin[1] = -96.0;
 boxMin[2] = -96.0;
 boxMax[0] =  96.0;
 boxMax[1] =  96.0;
 boxMax[2] =  96.0;
 rbi->SetBoxMin(boxMin);
 rbi->SetBoxMax(boxMax);
double dAngle = angular_arc / double(nProj);
 // Geometry
 typedef rtk::ThreeDCircularProjectionGeometry GeometryType;
 GeometryType::Pointer geometry = GeometryType::New();
 for( int i=0; i < nProj; i++)
{
    double angle = first_angle + double(i) * dAngle;
    // cout << angle << endl;
   geometry->AddProjection(500., 1000., -angle);
  }
 rbi->SetGeometry( geometry );
 rbi->Update();
 fp->SetGeometry( geometry );
 fp->Update();
 CheckImageQuality<OutputImageType>(rbi->GetOutput(), fp->GetOutput());

// std::cout << "\n\nTest PASSED! " << std::endl;

 WriteITK(fp->GetOutput());
 WriteITK(rbi->GetOutput());

}