00001 /*========================================================================= 00002 00003 Program: Medical Imaging & Interaction Toolkit 00004 Language: C++ 00005 Date: $Date: 2009-05-28 17:19:30 +0200 (Thu, 28 May 2009) $ 00006 Version: $Revision: 17495 $ 00007 00008 Copyright (c) German Cancer Research Center, Division of Medical and 00009 Biological Informatics. All rights reserved. 00010 See MITKCopyright.txt or https://www.mitk.org/copyright.html for details. 00011 00012 This software is distributed WITHOUT ANY WARRANTY; without even 00013 the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR 00014 PURPOSE. See the above copyright notices for more information. 00015 00016 =========================================================================*/ 00017 00018 #include "mitkPyramidalRegistrationMethod.h" 00019 00020 00021 namespace mitk { 00022 00023 PyramidalRegistrationMethod::PyramidalRegistrationMethod() : m_Observer(NULL), m_Interpolator(0) 00024 { 00025 m_OptimizerParameters = OptimizerParameters::New(); 00026 m_TransformParameters = TransformParameters::New(); 00027 m_MetricParameters = MetricParameters::New(); 00028 m_ReferenceImage = Image::New(); 00029 m_MovingMask = Image::New(); 00030 m_FixedMask = Image::New(); 00031 00032 m_Preset = new mitk::RigidRegistrationTestPreset(); 00033 00034 bool succeed = m_Preset->LoadPreset(); 00035 if(!succeed) 00036 { 00037 std::cout << "RigidRegistrationParameters.xml is empty or does not exist. There are no presets to select." << std::endl; 00038 return; 00039 } 00040 00041 m_UseMask = false; 00042 m_BlurMovingImage = true; 00043 m_BlurFixedImage = true; 00044 00045 } 00046 00047 PyramidalRegistrationMethod::~PyramidalRegistrationMethod() 00048 { 00049 00050 } 00051 00052 void PyramidalRegistrationMethod::GenerateData() 00053 { 00054 if (this->GetInput()) 00055 { 00056 AccessByItk(this->GetInput(), GenerateData2); 00057 } 00058 } 00059 00060 void PyramidalRegistrationMethod::SetObserver(RigidRegistrationObserver::Pointer observer) 00061 { 00062 m_Observer = observer; 00063 } 00064 00065 void PyramidalRegistrationMethod::SetInterpolator(int interpolator) 00066 { 00067 m_Interpolator = interpolator; 00068 } 00069 00070 void PyramidalRegistrationMethod::SetReferenceImage(Image::Pointer fixedImage) 00071 { 00072 m_ReferenceImage = fixedImage; 00073 SetNthInput(1, m_ReferenceImage); 00074 Modified(); 00075 } 00076 00077 00078 mitk::TransformParameters::Pointer PyramidalRegistrationMethod::ParseTransformParameters(itk::Array<double> transformValues) 00079 { 00080 mitk::TransformParameters::Pointer transformParameters = TransformParameters::New(); 00081 00082 itk::Array<double> initialParameters; 00083 if(transformParameters->GetInitialParameters().size()) 00084 { 00085 initialParameters = transformParameters->GetInitialParameters(); 00086 } 00087 transformParameters = mitk::TransformParameters::New(); 00088 transformParameters->SetTransform(transformValues[0]); 00089 00090 if(transformParameters->GetInitialParameters().size()) 00091 { 00092 transformParameters->SetInitialParameters(initialParameters); 00093 } 00094 00095 // Set scales. Every type of transform has a different number of scales!!! 00096 // TODO: Finish for al types of transform (or find a better solution) 00097 itk::Array<double> scales; 00098 if(transformValues[0] == mitk::TransformParameters::AFFINETRANSFORM) scales.SetSize(12); 00099 if(transformValues[0] == mitk::TransformParameters::TRANSLATIONTRANSFORM) scales.SetSize(3); 00100 00101 for(unsigned int i = 0; i < scales.size(); i++) 00102 { 00103 scales[i] = transformValues[i+2]; 00104 } 00105 transformParameters->SetScales(scales); 00106 transformParameters->SetTransformInitializerOn(false); 00107 00108 // Use Scales 00109 if(transformValues[1] == 1) 00110 { 00111 transformParameters->SetUseOptimizerScales(true); 00112 } 00113 00114 return transformParameters; 00115 } 00116 00117 mitk::MetricParameters::Pointer PyramidalRegistrationMethod::ParseMetricParameters(itk::Array<double> metricValues) 00118 { 00119 mitk::MetricParameters::Pointer metricParameters = mitk::MetricParameters::New(); 00120 00121 metricParameters->SetMetric(metricValues[0]); 00122 metricParameters->SetComputeGradient(metricValues[1]); 00123 00124 // Some things have to be checked for every metric individually 00125 if(metricValues[0] == mitk::MetricParameters::MUTUALINFORMATIONHISTOGRAMIMAGETOIMAGEMETRIC) 00126 { 00127 metricParameters->SetNumberOfHistogramBinsMutualInformationHistogram(metricValues[2]); 00128 } 00129 00130 if(metricValues[0] == mitk::MetricParameters::MATTESMUTUALINFORMATIONIMAGETOIMAGEMETRIC) 00131 { 00132 metricParameters->SetSpatialSamplesMattesMutualInformation(metricValues[3]); 00133 metricParameters->SetNumberOfHistogramBinsMattesMutualInformation(metricValues[4]); 00134 } 00135 00136 return metricParameters; 00137 } 00138 00139 mitk::OptimizerParameters::Pointer PyramidalRegistrationMethod::ParseOptimizerParameters(itk::Array<double> optimizerValues) 00140 { 00141 mitk::OptimizerParameters::Pointer optimizerParameters = mitk::OptimizerParameters::New(); 00142 00143 optimizerParameters->SetOptimizer(optimizerValues[0]); 00144 optimizerParameters->SetMaximize(optimizerValues[1]); //should be when used with maximize mutual information for example 00145 00146 if(optimizerValues[0] == mitk::OptimizerParameters::GRADIENTDESCENTOPTIMIZER) 00147 { 00148 optimizerParameters->SetLearningRateGradientDescent(optimizerValues[2]); 00149 optimizerParameters->SetNumberOfIterationsGradientDescent(optimizerValues[3]); 00150 } 00151 00152 if(optimizerValues[0] == mitk::OptimizerParameters::REGULARSTEPGRADIENTDESCENTOPTIMIZER) 00153 { 00154 cout << "use regularstepgradientdescent" << endl; 00155 optimizerParameters->SetGradientMagnitudeToleranceRegularStepGradientDescent(optimizerValues[2]); 00156 optimizerParameters->SetMinimumStepLengthRegularStepGradientDescent(optimizerValues[3]); 00157 optimizerParameters->SetMaximumStepLengthRegularStepGradientDescent(optimizerValues[4]); 00158 optimizerParameters->SetRelaxationFactorRegularStepGradientDescent(optimizerValues[5]); 00159 optimizerParameters->SetNumberOfIterationsRegularStepGradientDescent(optimizerValues[6]); 00160 } 00161 00162 return optimizerParameters; 00163 } 00164 00165 void PyramidalRegistrationMethod::SetMovingMask(Image::Pointer movingMask) 00166 { 00167 m_MovingMask = movingMask; 00168 SetNthInput(3, m_MovingMask); 00169 Modified(); 00170 } 00171 00172 void PyramidalRegistrationMethod::SetFixedMask(Image::Pointer FixedMask) 00173 { 00174 m_FixedMask = FixedMask; 00175 SetNthInput(4, m_FixedMask); 00176 Modified(); 00177 } 00178 00179 00180 } // end namespace