Dear Insight user,<br><br>I am trying to 3D NonRigidRegistration(CT-CT).<br>The components i'm using are<br>BSplineDeformableTransform,<br>LBFGSBOptimizer,<br>NormalizedMutualInformationHistogramImageToImageMetric<br>(don't use MultiResolution)
<br><br>I have a 3D images 280*280*201 and spacing 1*1*1.<br>The time it takes to calculate each itertion is veeeeery slow.(Processing doesn't end......)<br><br>How can I solve that????<br><br>Regards.<br> Matsuo
<br><br>Code----------------------------------------------------------------------------------<br> const unsigned int ImageDimension = 3; <br> typedef signed short PixelType; <br><br> typedef itk::Image< PixelType, ImageDimension > FixedImageType;
<br> typedef itk::Image< PixelType, ImageDimension > MovingImageType;<br><br> const unsigned int SpaceDimension = ImageDimension;<br> const unsigned int SplineOrder = 3;<br> typedef double CoordinateRepType;
<br> typedef itk::BSplineDeformableTransform< CoordinateRepType, SpaceDimension, SplineOrder > TransformType;<br> typedef itk::LBFGSBOptimizer OptimizerType;<br> typedef itk::NormalizedMutualInformationHistogramImageToImageMetric< FixedImageType, MovingImageType > MetricType;
<br> typedef itk::ImageRegistrationMethod< FixedImageType, MovingImageType > RegistrationType;<br> typedef itk::LinearInterpolateImageFunction< MovingImageType, double > InterpolatorType;<br><br> MetricType::Pointer metric = MetricType::New();
<br> OptimizerType::Pointer optimizer = OptimizerType::New();<br> InterpolatorType::Pointer interpolator = InterpolatorType::New();<br> RegistrationType::Pointer registration = RegistrationType::New();<br> TransformType::Pointer transform = TransformType::New();
<br><br> registration->SetMetric( metric );<br> registration->SetOptimizer( optimizer );<br> registration->SetInterpolator( interpolator );<br> registration->SetTransform( transform );<br> <br> typedef itk::ImageFileReader< FixedImageType > FixedImageReaderType;
<br> typedef itk::ImageFileReader< MovingImageType > MovingImageReaderType; <br> <br> FixedImageReaderType::Pointer fixedImageReader = FixedImageReaderType::New();<br> MovingImageReaderType::Pointer movingImageReader = MovingImageReaderType::New();
<br><br> fixedImageReader->SetFileName( argv[1] ); <br> movingImageReader->SetFileName( argv[2] ); <br> FixedImageType::ConstPointer fixedImage = fixedImageReader->GetOutput();<br><br> registration->SetFixedImage( fixedImage );
<br> registration->SetMovingImage( movingImageReader->GetOutput() );<br><br> fixedImageReader->Update();<br><br> FixedImageType::RegionType fixedRegion = fixedImage->GetBufferedRegion();<br> registration->SetFixedImageRegion( fixedRegion );
<br><br> typedef TransformType::RegionType RegionType;<br> RegionType bsplineRegion;<br> RegionType::SizeType gridSizeOnImage;<br> RegionType::SizeType gridBorderSize;<br> RegionType::SizeType totalGridSize;
<br><br> gridSizeOnImage.Fill( 8 ); <br> gridBorderSize.Fill( 3 );<br> totalGridSize = gridSizeOnImage + gridBorderSize;<br><br> bsplineRegion.SetSize( totalGridSize );<br><br> typedef TransformType::SpacingType SpacingType;
<br> SpacingType spacing = fixedImage->GetSpacing();<br><br> typedef TransformType::OriginType OriginType;<br> OriginType origin = fixedImage->GetOrigin();;<br><br> FixedImageType::SizeType fixedImageSize =
fixedRegion.GetSize();<br><br> for(unsigned int r=0; r<ImageDimension; r++)<br> {<br> spacing[r] *= floor( static_cast<double>(fixedImageSize[r] - 1) / <br> static_cast<double>(gridSizeOnImage[r] - 1) );
<br> origin[r] -= spacing[r]; <br> }<br><br> transform->SetGridSpacing( spacing );<br> transform->SetGridOrigin( origin );<br> transform->SetGridRegion( bsplineRegion );<br> <br><br> typedef TransformType::ParametersType ParametersType;
<br> const unsigned int numberOfParameters = transform->GetNumberOfParameters();<br> ParametersType parameters( numberOfParameters );<br> parameters.Fill( 0.0 );<br> transform->SetParameters( parameters );
<br> registration->SetInitialTransformParameters( transform->GetParameters() );<br><br> unsigned int numberOfHistogramBins = 256;<br> MetricType::HistogramType::SizeType histogramSize;<br> histogramSize[0] = numberOfHistogramBins;
<br> histogramSize[1] = numberOfHistogramBins;<br> metric->SetHistogramSize( histogramSize );<br> <br> typedef MetricType::ScalesType ScalesType;<br> ScalesType scales( numberOfParameters );<br><br> scales.Fill
( 1.0 );<br> <br> metric->SetDerivativeStepLengthScales(scales);<br><br> OptimizerType::BoundSelectionType boundSelect( transform->GetNumberOfParameters() );<br> OptimizerType::BoundValueType upperBound( transform->GetNumberOfParameters() );
<br> OptimizerType::BoundValueType lowerBound( transform->GetNumberOfParameters() );<br><br> boundSelect.Fill( 0 );<br> upperBound.Fill( 0.0 );<br> lowerBound.Fill( 0.0 );<br><br> optimizer->SetBoundSelection( boundSelect );
<br> optimizer->SetUpperBound( upperBound );<br> optimizer->SetLowerBound( lowerBound );<br><br> optimizer->SetCostFunctionConvergenceFactor( 1e+7); <br> optimizer->SetProjectedGradientTolerance(1e-4 );
<br> optimizer->SetMaximumNumberOfIterations( 500 );<br> optimizer->SetMaximumNumberOfEvaluations( 500 );<br> optimizer->SetMaximumNumberOfCorrections( 12 ); <br><br> CommandIterationUpdate::Pointer observer = CommandIterationUpdate::New();
<br> optimizer->AddObserver( itk::IterationEvent(), observer );<br><br> try <br> { <br> registration->StartRegistration(); <br> } <br> catch( itk::ExceptionObject & err ) <br> { <br> std::cerr << "ExceptionObject caught !" << std::endl;
<br> std::cerr << err << std::endl; <br> return -1;<br> }<br> ::<br> ::<br>--------------------------------------------------------------------------------------<br><br><br><br><br><br><br>
<br><br><br><br><br><br><br><br><br><br><br><br><br>