[Insight-users] Affine registration and Viola-Wells MI
Voigt, Markus
Markus.Voigt at medizin.uni-leipzig.de
Wed Jun 6 08:26:24 EDT 2007
Hello,
I'm trying to create a program where I want to use the Viola-Wells
(Mutual Information algorithm) and the affine registration.
In the examples of ITK I found the MI algorithm and the affine algorithm
but both are using different Optimizer. I tried to match all the things
together in one cpp-file so that it should work but it doesn't
I got this error message on the command line:
"MutualInformationImageToImageMetric(018CBC40): All the sampled point
mapped to outside of the moving image"
Could someone help me? I think it is something simple, but I haven't got
a clue.
Cheers,
markus
This is the source code
//start Viola-Wells mutual information
metric->SetFixedImageStandardDeviation( 0.4 );
metric->SetMovingImageStandardDeviation( 0.4 );
//load pictures
typedef itk::ImageFileReader< FixedImageType > FixedImageReaderType;
typedef itk::ImageFileReader< MovingImageType > MovingImageReaderType;
FixedImageReaderType::Pointer fixedImageReader =
FixedImageReaderType::New();
MovingImageReaderType::Pointer movingImageReader =
MovingImageReaderType::New();
fixedImageReader->SetFileName( arg1 );
movingImageReader->SetFileName( arg2 );
typedef itk::NormalizeImageFilter<
FixedImageType,
InternalImageType
> FixedNormalizeFilterType;
typedef itk::NormalizeImageFilter<
FixedImageType,
InternalImageType
>
MovingNormalizeFilterType;
FixedNormalizeFilterType::Pointer fixedNormalizer =
FixedNormalizeFilterType::New();
MovingNormalizeFilterType::Pointer movingNormalizer =
MovingNormalizeFilterType::New();
typedef itk::DiscreteGaussianImageFilter<
InternalImageType,
InternalImageType
> GaussianFilterType;
GaussianFilterType::Pointer fixedSmoother =
GaussianFilterType::New();
GaussianFilterType::Pointer movingSmoother =
GaussianFilterType::New();
fixedSmoother->SetVariance( 2.0 );
movingSmoother->SetVariance( 2.0 );
fixedNormalizer->SetInput( fixedImageReader->GetOutput() );
movingNormalizer->SetInput( movingImageReader->GetOutput() );
fixedSmoother->SetInput( fixedNormalizer->GetOutput() );
movingSmoother->SetInput( movingNormalizer->GetOutput() );
registration->SetFixedImage( fixedSmoother->GetOutput() );
registration->SetMovingImage( movingSmoother->GetOutput() );
fixedNormalizer->Update();
FixedImageType::RegionType fixedImageRegion =
fixedNormalizer->GetOutput()->GetBufferedRegion();
registration->SetFixedImageRegion( fixedImageRegion );
//end of Viola Wells MI
//start with affine part
typedef itk::CenteredTransformInitializer< TransformType,
FixedImageType,MovingImageType > TransformInitializerType;
TransformInitializerType::Pointer initializer =
TransformInitializerType::New();
initializer->SetTransform( transform );
initializer->SetFixedImage( fixedImageReader->GetOutput() );
initializer->SetMovingImage( movingImageReader->GetOutput() );
initializer->MomentsOn();
initializer->InitializeTransform();
registration->SetInitialTransformParameters(transform->GetParameters()
);
double translationScale = 1.0 / 1000.0;
unsigned int maxNumberOfIterations = atoi( arg7 );
typedef OptimizerType::ScalesType OptimizerScalesType;
OptimizerScalesType optimizerScales(
transform->GetNumberOfParameters() );
//rotation matrix factor
optimizerScales[0] = 1.0;
optimizerScales[1] = 1.0;
//rotation center
optimizerScales[2] = 1.0;
optimizerScales[3] = 1.0;
//components of the translation
optimizerScales[4] = translationScale;
optimizerScales[5] = translationScale;
optimizer->SetScales( optimizerScales );
optimizer->SetLearningRate( 15.0 );
optimizer->SetNumberOfIterations( maxNumberOfIterations );
optimizer->MaximizeOn();
CommandIterationUpdate::Pointer observer =
CommandIterationUpdate::New();
optimizer->AddObserver( itk::IterationEvent(), observer );
//end with affine part
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://public.kitware.com/pipermail/insight-users/attachments/20070606/740d4e7a/attachment.htm
More information about the Insight-users
mailing list