[Insight-users] re gistration error RegularStepGradientDescentOptimizer
EsmeRuiz
esmeralda.ruizpujadas at gmail.com
Mon Feb 21 05:56:28 EST 2011
Hello, I am new with ITK. And I have tried to do a model based registration
using regular step gradient descent optimizer and I get this error
The size of Scales 6, but the NumberOfParameters for the CostFunction is 3.
I don't understand what it means.
The code is:
void registrations::modelBasedRegistration(float **imgFIXED, int size_row,
int size_col, int absFrame){
typedef itk::GroupSpatialObject< 2 > GroupType;
typedef itk::EllipseSpatialObject< 2 > EllipseType;
typedef itk::Image< float, 2 > ImageType;
EllipseType::Pointer ellipse1 = EllipseType::New();
EllipseType::Pointer ellipse2 = EllipseType::New();
//EllipseType::Pointer ellipse3 = EllipseType::New();
ellipse1->SetRadius( 1.0 );
ellipse2->SetRadius( 2.0 );
// Software Guide : BeginCodeSnippet
EllipseType::TransformType::OffsetType offset;
offset[ 0 ] = (int)size_col/2.0;
offset[ 1 ] = (int)size_row/2.0;
ellipse1->GetObjectToParentTransform()->SetOffset(offset);
ellipse1->ComputeObjectToWorldTransform();
offset[ 0 ] = (int)size_col/2.0;
offset[ 1 ] = (int)size_row/2.0;
ellipse2->GetObjectToParentTransform()->SetOffset(offset);
ellipse2->ComputeObjectToWorldTransform();
// Software Guide : BeginCodeSnippet
GroupType::Pointer group = GroupType::New();
group->AddSpatialObject( ellipse1 );
group->AddSpatialObject( ellipse2 );
// Software Guide : BeginCodeSnippet
typedef itk::SpatialObjectToImageFilter< GroupType, ImageType >
SpatialObjectToImageFilterType;
// Software Guide : EndCodeSnippet
// Software Guide : BeginCodeSnippet
SpatialObjectToImageFilterType::Pointer imageFilter =
SpatialObjectToImageFilterType::New();
// Software Guide : EndCodeSnippet
// Software Guide : BeginCodeSnippet
imageFilter->SetInput( group );
// Software Guide : EndCodeSnippet
// Software Guide : BeginCodeSnippet
ImageType::SizeType size;
size[ 0 ] = 200;
size[ 1 ] = 200;
imageFilter->SetSize( size );
// Software Guide : BeginCodeSnippet
imageFilter->Update();
// Software Guide : EndCodeSnippet
// Software Guide : BeginCodeSnippet
typedef itk::DiscreteGaussianImageFilter< ImageType, ImageType >
GaussianFilterType;
GaussianFilterType::Pointer gaussianFilter =
GaussianFilterType::New();
// Software Guide : EndCodeSnippet
// Software Guide : BeginCodeSnippet
gaussianFilter->SetInput( imageFilter->GetOutput() );
// Software Guide : EndCodeSnippet
// Software Guide : BeginCodeSnippet
const double variance = 20;
gaussianFilter->SetVariance(variance);
gaussianFilter->Update();
// Software Guide : EndCodeSnippet
// Software Guide : BeginCodeSnippet
typedef itk::ImageToSpatialObjectRegistrationMethod< ImageType, GroupType
> RegistrationType;
RegistrationType::Pointer registration = RegistrationType::New();
typedef SimpleImageToSpatialObjectMetric< ImageType, GroupType >
MetricType;
MetricType::Pointer metric = MetricType::New();
// Software Guide : EndCodeSnippet
// Software Guide : BeginCodeSnippet
typedef itk::LinearInterpolateImageFunction< ImageType, double >
InterpolatorType;
InterpolatorType::Pointer interpolator = InterpolatorType::New();
// Software Guide : EndCodeSnippet
typedef itk::RegularStepGradientDescentOptimizer OptimizerType;
OptimizerType::Pointer optimizer = OptimizerType::New();
typedef itk::CenteredSimilarity2DTransform< double > TransformType;
TransformType::Pointer transform = TransformType::New();
double steplength = 0.1; // 1.0
optimizer->SetMaximumStepLength( steplength );
optimizer->SetMinimumStepLength( 0.0001 );
optimizer->SetNumberOfIterations( 500 );
typedef OptimizerType::ScalesType OptimizerScalesType;
int numOfParameters = transform->GetNumberOfParameters();
OptimizerScalesType optimizerScales( transform->GetNumberOfParameters()
);
const double translationScale = 1.0 / 100.0;
optimizerScales[0] = 10.0;
optimizerScales[1] = 1.0;
optimizerScales[2] = translationScale;
optimizerScales[3] = translationScale;
optimizerScales[4] = translationScale;
optimizerScales[5] = translationScale;
optimizer->SetScales( optimizerScales );
CommandIterationUpdate::Pointer observer = CommandIterationUpdate::New();
optimizer->AddObserver( itk::IterationEvent(), observer );
registration->SetFixedImage( gaussianFilter->GetOutput() );
registration->SetMovingSpatialObject( group );
registration->SetTransform( transform );
registration->SetInterpolator( interpolator );
registration->SetOptimizer( optimizer );
registration->SetMetric( metric );
typedef float InputPixelType;
typedef itk::Image< InputPixelType, 2 > InputImageType;
typedef itk::CenteredTransformInitializer<
TransformType,
InputImageType,
ImageType > TransformInitializerType;
TransformInitializerType::Pointer initializer =
TransformInitializerType::New();
initializer->SetTransform( transform );
FixedImageType::Pointer fixedImageReader = FixedImageType::New();
CreateImage(fixedImageReader, size_row, size_col,imgFIXED);
initializer->SetFixedImage( fixedImageReader );
initializer->SetMovingImage( imageFilter->GetOutput() );
initializer->MomentsOn();
initializer->InitializeTransform();
double initialScale = 1.0;
double initialAngle = 0.5;
transform->SetScale( initialScale );
transform->SetAngle( initialAngle );
registration->SetInitialTransformParameters( transform->GetParameters()
);
//optimizer->MaximizeOn();
//Finally, we trigger the execution of the registration process with the
// \code{StartRegistration()} method. We place this call in a
// \code{try/catch} block in case any exception is thrown during the
// process.
try
{
registration->StartRegistration();
}
catch( itk::ExceptionObject & err )
{
std::cerr << "ExceptionObject caught !" << std::endl;
std::cerr << err << std::endl;
return ;
}
// Software Guide : BeginCodeSnippet
RegistrationType::ParametersType finalParameters
= registration->GetLastTransformParameters();
std::cout << "Final Solution is : " << finalParameters << std::endl;
// Software Guide : EndCodeSnippet
typedef itk::ResampleImageFilter<ImageType,
FixedImageType > ResampleFilterType;
TransformType::Pointer finalTransform = TransformType::New();
finalTransform->SetParameters( finalParameters );
ResampleFilterType::Pointer resampler = ResampleFilterType::New();
resampler->SetTransform( finalTransform );
resampler->SetInput( imageFilter->GetOutput() );
ImageType::Pointer fixedImage = fixedImageReader;
resampler->SetSize( fixedImage->GetLargestPossibleRegion().GetSize()
);
resampler->SetOutputOrigin( fixedImage->GetOrigin() );
resampler->SetOutputSpacing( fixedImage->GetSpacing() );
resampler->SetDefaultPixelValue( 0 );
typedef unsigned char OutputPixelType;
typedef itk::Image< OutputPixelType, 2> OutputImageType;
typedef itk::CastImageFilter< FixedImageType, OutputImageType >
CastFilterType;
typedef itk::ImageFileWriter< OutputImageType > writerType;
writerType::Pointer writer2 = writerType::New();
CastFilterType::Pointer caster = CastFilterType::New();
writer2->SetFileName( "reg.jpg" );
caster->SetInput( resampler->GetOutput() );
writer2->SetInput( caster->GetOutput() );
try
{
writer2->Update();
}
catch( itk::ExceptionObject & err )
{
std::cerr << "ExceptionObject caught !" << std::endl;
std::cerr << err << std::endl;
return ;
}
return;
}
Thank you very much !!
--
View this message in context: http://old.nabble.com/registration-error-RegularStepGradientDescentOptimizer-tp30976153p30976153.html
Sent from the ITK - Users mailing list archive at Nabble.com.
More information about the Insight-users
mailing list