[Insight-users] White Output after Rigid Registration
Andy Eow
vtkitk at hotmail.com
Wed Sep 29 12:11:30 EDT 2004
Hi Luis,
I'm using 3D Slicer to visualize the volume. The actual values in the volume
are all the same ... hence I don't think the problem is with visualizing.
I'm guessing there's something I'm not setting right in the registration
process. Pls advise. Thanks!
Cheers,
Andy
----- Original Message -----
From: "Luis Ibanez" <luis.ibanez at kitware.com>
To: "Andy Eow" <vtkitk at hotmail.com>
Cc: <insight-users at itk.org>
Sent: Wednesday, September 29, 2004 11:54 AM
Subject: Re: [Insight-users] White Output after Rigid Registration
> 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