[Insight-users] White Output after Rigid Registration

Luis Ibanez luis.ibanez at kitware.com
Wed Sep 29 11:54:14 EDT 2004


Hi Andy,

What are you  using for visualizing your resampled moving image ?

When you say that the output is "white", did you verified the
actual values in the output image ?

Please let us know.


    Thanks


      Luis


-----------------
Andy Eow wrote:

> Hi,
>  
> I'm trying to perform a straightforward rigid registration in 3D using 
> sample code from the MultiResMIRegistration application. The transform 
> parameters after registration are as follows for my MRI (T1 & T2) 
> dataset: [0.61162, 0.0627385, 0.0105601, 0.78859, 1.63678, -0.662944, 
> 0.223458]. However, I suspect my post registration resampling is not 
> working because the resulting volume from that is completely white. 
> Attached is the exact code that I'm running. Any advice is appreciated. 
> Thanks!!!
>  
> VolumeType::Pointer MakeSymmetrical( VolumeType::Pointer fixedVol, 
> VolumeType::Pointer movingVol ) {
>   typedef itk::ChangeInformationImageFilter< VolumeType > CentererType;
>   typedef itk::NormalizeImageFilter< VolumeType, VolumeType > 
> NormalizerType;
>   typedef itk::QuaternionRigidTransform< double > TransformType;
>   typedef itk::QuaternionRigidTransformGradientDescentOptimizer 
> OptimizerType;
>   typedef itk::MutualInformationImageToImageMetric< VolumeType, 
> VolumeType > MetricType;
>   typedef itk::LinearInterpolateImageFunction< VolumeType, double > 
> InterpolatorType;
>   typedef itk::RecursiveMultiResolutionPyramidImageFilter< VolumeType, 
> VolumeType > FixedImagePyramidType;
>   typedef itk::RecursiveMultiResolutionPyramidImageFilter< VolumeType, 
> VolumeType > MovingImagePyramidType;
>   typedef itk::MultiResolutionImageRegistrationMethod< VolumeType, 
> VolumeType > RegistrationType;
>   typedef itk::FixedArray< unsigned int, 3 > ShrinkFactorsArray;
>   typedef itk::Array< unsigned int > UnsignedIntArray;
>   typedef itk::Array< double > DoubleArray;
>   typedef itk::AffineTransform< double, 3 > AffineTransformType;
>   typedef AffineTransformType::ScalarType CoordRepType;
>   typedef itk::LinearInterpolateImageFunction< VolumeType, CoordRepType 
>  > ResampleInterpolatorType;
>   typedef itk::ResampleImageFilter< VolumeType, VolumeType > ResamplerType;
>  
>   // Parameters
>   unsigned short noOfLevels = 1;
>   double translationScale = 1.0;
>   double movingVolStdDev = 0.4;
>   double fixedVolStdDev = 0.4;
>   unsigned short noOfSpatialSamples = 50;
>   DoubleArray learningRates = DoubleArray( noOfLevels );
>   learningRates.Fill( 1e-4 );
>   UnsignedIntArray noOfIterations = UnsignedIntArray( noOfLevels );
>   noOfIterations.Fill( 2500 );
>   ShrinkFactorsArray fixedVolShrinkFactors;
>   fixedVolShrinkFactors.Fill( 1 );
>   ShrinkFactorsArray movingVolShrinkFactors;
>   movingVolShrinkFactors.Fill( 1 );
>  
>   // Fixed Volume
>   CentererType::Pointer centerer =  CentererType::New();
>   centerer->CenterImageOn();
>   centerer->SetInput( fixedVol );
>  
>   NormalizerType::Pointer normalizer = NormalizerType::New(); 
>   normalizer->SetInput( centerer->GetOutput() );
>   ITK_TRY_MACRO( normalizer->Update() );
>   VolumeType::Pointer tFixedVol = normalizer->GetOutput();
>  
>   // Moving Volume
>   CentererType::Pointer centerer2 =  CentererType::New();
>   centerer2->CenterImageOn();
>   centerer2->SetInput( movingVol );
>  
>   NormalizerType::Pointer normalizer2 = NormalizerType::New(); 
>   normalizer2->SetInput( centerer2->GetOutput() );
>   ITK_TRY_MACRO( normalizer2->Update() );
>   VolumeType::Pointer tMovingVol = normalizer2->GetOutput();
>  
>   // Setup the registrator
>   TransformType::Pointer transform = TransformType::New();
>   RegistrationType::ParametersType transformInitialParameters = 
> RegistrationType::ParametersType( transform->GetNumberOfParameters() );
>   transformInitialParameters.Fill( 0.0 );
>   transformInitialParameters[3] = 1.0;
>  
>   OptimizerType::Pointer optimizer = OptimizerType::New();
>   OptimizerType::ScalesType scales( transform->GetNumberOfParameters() );
>   scales.Fill( 1.0 );
>   for ( int i = 4; i < 7; i++ )
>     scales[i] = translationScale;
>   optimizer->SetScales( scales );
>   optimizer->MaximizeOn();
>  
>   MetricType::Pointer metric = MetricType::New();
>   metric->SetMovingImageStandardDeviation( movingVolStdDev );
>   metric->SetFixedImageStandardDeviation( fixedVolStdDev );
>   metric->SetNumberOfSpatialSamples( noOfSpatialSamples );
>  
>   FixedImagePyramidType::Pointer fixedImagePyramid = 
> FixedImagePyramidType::New();
>   fixedImagePyramid->SetNumberOfLevels( noOfLevels );
>   fixedImagePyramid->SetStartingShrinkFactors( 
> fixedVolShrinkFactors.GetDataPointer() );
>  
>   MovingImagePyramidType::Pointer movingImagePyramid = 
> MovingImagePyramidType::New(); 
>   movingImagePyramid->SetNumberOfLevels( noOfLevels );
>   movingImagePyramid->SetStartingShrinkFactors( 
> movingVolShrinkFactors.GetDataPointer() );
>  
>   InterpolatorType::Pointer interpolator = InterpolatorType::New();
>  
>   RegistrationType::Pointer registration  = RegistrationType::New();
>   registration->SetTransform( transform );
>   registration->SetOptimizer( optimizer );
>   registration->SetMetric( metric );
>   registration->SetInterpolator( interpolator );
>   registration->SetFixedImagePyramid( fixedImagePyramid );
>   registration->SetMovingImagePyramid( movingImagePyramid );
>   registration->SetFixedImage( tFixedVol );
>   registration->SetMovingImage( tMovingVol );
>   registration->SetNumberOfLevels( noOfLevels );
>   registration->SetInitialTransformParameters( transformInitialParameters );
>   registration->SetFixedImageRegion( tFixedVol->GetBufferedRegion() );
>   ITK_TRY_MACRO( registration->StartRegistration() );
>   MESSAGE( "Transform Parameters (post-reg): " << 
> transform->GetParameters() );
>   MESSAGE( "Rotation (post-reg): " << transform->GetRotation() );
>   MESSAGE( "Translation (post-reg): " << transform->GetTranslation() );
>  
>   // Setup the resampler
>   AffineTransformType::Pointer resamTransform = AffineTransformType::New();
>   resamTransform->SetIdentity();
>   resamTransform->SetParameters( transform->GetParameters() );
>   resamTransform->SetMatrix( transform->GetRotationMatrix() );
>   resamTransform->SetOffset( transform->GetOffset() );
>  
>   ResampleInterpolatorType::Pointer resamInterpolator = 
> ResampleInterpolatorType::New();
>  
>   ResamplerType::Pointer resampler = ResamplerType::New();
>   resampler->SetInput( tMovingVol );
>   resampler->SetTransform( resamTransform );
>   resampler->SetInterpolator( resamInterpolator );
>   resampler->SetSize( tFixedVol->GetLargestPossibleRegion().GetSize() );
>   resampler->SetOutputOrigin( tFixedVol->GetOrigin() );
>   resampler->SetOutputSpacing( tFixedVol->GetSpacing() );
>   resampler->SetDefaultPixelValue( 0 );
>   ITK_TRY_MACRO( resampler->Update() );
>  
>   return resampler->GetOutput();
> }
>  
>  
> Cheers,
> Andy
> 
> 
> ------------------------------------------------------------------------
> 
> _______________________________________________
> Insight-users mailing list
> Insight-users at itk.org
> http://www.itk.org/mailman/listinfo/insight-users






More information about the Insight-users mailing list