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