Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018 namespace mitk {
00019
00020 template <class TRegistration, class TPixel>
00021 class RegistrationInterfaceCommand : public itk::Command
00022 {
00023
00024 public:
00025 typedef RegistrationInterfaceCommand Self;
00026 typedef itk::Command Superclass;
00027 typedef itk::SmartPointer<Self> Pointer;
00028 itkNewMacro( Self );
00029 protected:
00030 RegistrationInterfaceCommand()
00031 {
00032 m_UseMask = false;
00033 }
00034
00035 public:
00036
00037
00038
00039 typedef itk::MultiResolutionImageRegistrationMethod< itk::Image<float, 3>
00040 , itk::Image<float, 3> > RegistrationType;
00041
00042
00043 typedef RegistrationType * RegistrationPointer;
00044 typedef itk::SingleValuedNonLinearOptimizer OptimizerType;
00045 typedef OptimizerType * OptimizerPointer;
00046 typedef itk::ImageMaskSpatialObject< 3 > MaskType;
00047
00048
00049 mitk::RigidRegistrationObserver::Pointer observer;
00050 bool m_UseMask;
00051 std::vector<std::string> m_Presets;
00052 MaskType::Pointer m_BrainMask;
00053
00054 void Execute(itk::Object * object, const itk::EventObject & event)
00055 {
00056 if( !(itk::IterationEvent().CheckEvent( &event )) )
00057 {
00058 return;
00059 }
00060
00061 RegistrationPointer registration = dynamic_cast<RegistrationPointer>( object );
00062
00063
00064
00065
00066
00067
00068 std::cout << "-------------------------------------" << std::endl;
00069 std::cout << "MultiResolution Level : "
00070 << registration->GetCurrentLevel() << std::endl << std::endl;
00071
00072
00073 if ( registration->GetCurrentLevel() == 0 )
00074 {
00075
00076 }
00077 else
00078 {
00079
00080 mitk::RigidRegistrationTestPreset *preset = new mitk::RigidRegistrationTestPreset();
00081
00082 if( preset->LoadPreset() )
00083 {
00084
00085 mitk::OptimizerParameters::Pointer optimizerParameters = mitk::OptimizerParameters::New();
00086 itk::Array<double> optimizerValues = preset->getOptimizerValues(m_Presets[ registration->GetCurrentLevel() ]);
00087
00088 optimizerParameters->SetOptimizer(optimizerValues[0]);
00089 optimizerParameters->SetMaximize(optimizerValues[1]);
00090
00091 if(optimizerValues[0] == mitk::OptimizerParameters::GRADIENTDESCENTOPTIMIZER)
00092 {
00093 optimizerParameters->SetLearningRateGradientDescent(optimizerValues[2]);
00094 optimizerParameters->SetNumberOfIterationsGradientDescent(optimizerValues[3]);
00095 }
00096
00097 if(optimizerValues[0] == mitk::OptimizerParameters::REGULARSTEPGRADIENTDESCENTOPTIMIZER)
00098 {
00099 cout << "use regularstepgradientdescent" << endl;
00100 optimizerParameters->SetGradientMagnitudeToleranceRegularStepGradientDescent(optimizerValues[2]);
00101 optimizerParameters->SetMinimumStepLengthRegularStepGradientDescent(optimizerValues[3]);
00102 optimizerParameters->SetMaximumStepLengthRegularStepGradientDescent(optimizerValues[4]);
00103 optimizerParameters->SetRelaxationFactorRegularStepGradientDescent(optimizerValues[5]);
00104 optimizerParameters->SetNumberOfIterationsRegularStepGradientDescent(optimizerValues[6]);
00105 }
00106
00107
00108
00109 typename OptimizerFactory::Pointer optFac = OptimizerFactory::New();
00110 optFac->SetOptimizerParameters(optimizerParameters);
00111 optFac->SetNumberOfTransformParameters(registration->GetTransform()->GetNumberOfParameters());
00112 typename OptimizerType::Pointer optimizer = optFac->GetOptimizer();
00113
00114 if(observer.IsNotNull())
00115 {
00116 optimizer->AddObserver(itk::AnyEvent(), observer);
00117 }
00118
00119
00120 itk::Array<double> transformValues = preset->getTransformValues(m_Presets[ registration->GetCurrentLevel() ]);
00121
00122 itk::Array<double> scales;
00123 if(transformValues[0] == mitk::TransformParameters::AFFINETRANSFORM) scales.SetSize(12);
00124 mitk::TransformParameters::Pointer transformParameters = mitk::TransformParameters::New();
00125 transformParameters->SetTransform(transformValues[0]);
00126
00127 for(unsigned int i = 0; i < scales.size(); i++)
00128 {
00129 scales[i] = transformValues[i+2];
00130 std::cout << "scale " << i << ": " << scales[i] << std::endl;
00131 }
00132
00133 transformParameters->SetScales(scales);
00134
00135
00136
00137
00138 if(transformValues[1] == 1)
00139 {
00140 transformParameters->SetUseOptimizerScales(true);
00141 }
00142
00143 if (transformParameters->GetUseOptimizerScales())
00144 {
00145 itk::Array<double> optimizerScales = transformParameters->GetScales();
00146 typename OptimizerType::ScalesType scales( registration->GetTransform()->GetNumberOfParameters() );
00147 for (unsigned int i = 0; i < scales.Size(); i++)
00148 {
00149 scales[i] = optimizerScales[i];
00150 }
00151 optimizer->SetScales( scales );
00152 }
00153
00154
00155 registration->SetOptimizer(optimizer);
00156
00157
00158 }
00159
00160
00161 }
00162
00163 registration->Print(std::cout,0);
00164 std::cout << std::endl;
00165 std::cout << "METRIC" << std::endl;
00166 registration->GetMetric()->Print(std::cout,0);
00167 std::cout << std::endl;
00168 std::cout << "OPTIMIZER" << std::endl;
00169 registration->GetOptimizer()->Print(std::cout,0);
00170 std::cout << std::endl;
00171 std::cout << "TRANSFORM" << std::endl;
00172 registration->GetTransform()->Print(std::cout,0);
00173 }
00174
00175 void Execute(const itk::Object * , const itk::EventObject & )
00176 { return; }
00177
00178 };
00179
00180 }