ITK
4.1.0
Insight Segmentation and Registration Toolkit
|
00001 /*========================================================================= 00002 * 00003 * Copyright Insight Software Consortium 00004 * 00005 * Licensed under the Apache License, Version 2.0 (the "License"); 00006 * you may not use this file except in compliance with the License. 00007 * You may obtain a copy of the License at 00008 * 00009 * http://www.apache.org/licenses/LICENSE-2.0.txt 00010 * 00011 * Unless required by applicable law or agreed to in writing, software 00012 * distributed under the License is distributed on an "AS IS" BASIS, 00013 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 00014 * See the License for the specific language governing permissions and 00015 * limitations under the License. 00016 * 00017 *=========================================================================*/ 00018 #ifndef __itkFEMImageMetricLoad_h 00019 #define __itkFEMImageMetricLoad_h 00020 00021 #include "itkFEMLoadElementBase.h" 00022 00023 #include "itkImage.h" 00024 #include "itkTranslationTransform.h" 00025 00026 #include "itkImageRegionIteratorWithIndex.h" 00027 #include "itkNeighborhoodIterator.h" 00028 #include "itkNeighborhoodIterator.h" 00029 #include "itkNeighborhoodInnerProduct.h" 00030 #include "itkDerivativeOperator.h" 00031 #include "itkForwardDifferenceOperator.h" 00032 #include "itkLinearInterpolateImageFunction.h" 00033 #include "vnl/vnl_math.h" 00034 00035 #include <itkMutualInformationImageToImageMetric.h> 00036 #include <itkMattesMutualInformationImageToImageMetric.h> 00037 #include <itkMeanSquaresImageToImageMetric.h> 00038 #include <itkNormalizedCorrelationImageToImageMetric.h> 00039 00040 namespace itk 00041 { 00042 namespace fem 00043 { 00068 template <class TMoving, class TFixed> 00069 class ImageMetricLoad : public LoadElement 00070 { 00071 public: 00072 00074 typedef ImageMetricLoad Self; 00075 typedef LoadElement Superclass; 00076 typedef SmartPointer<Self> Pointer; 00077 typedef SmartPointer<const Self> ConstPointer; 00078 00080 itkSimpleNewMacro(Self); 00081 00083 itkTypeMacro(ImageMetricLoad, LoadElement); 00084 00087 virtual::itk::LightObject::Pointer CreateAnother(void) const; 00088 00089 // Necessary typedefs for dealing with images BEGIN 00090 typedef typename LoadElement::Float Float; 00091 00092 typedef TMoving MovingType; 00093 typedef typename MovingType::ConstPointer MovingConstPointer; 00094 typedef MovingType * MovingPointer; 00095 typedef TFixed FixedType; 00096 typedef FixedType * FixedPointer; 00097 typedef typename FixedType::ConstPointer FixedConstPointer; 00098 00100 itkStaticConstMacro(ImageDimension, unsigned int, 00101 MovingType::ImageDimension); 00102 00103 typedef ImageRegionIteratorWithIndex<MovingType> RefRegionIteratorType; 00104 typedef ImageRegionIteratorWithIndex<FixedType> TarRegionIteratorType; 00105 00106 typedef NeighborhoodIterator<MovingType> 00107 MovingNeighborhoodIteratorType; 00108 typedef typename MovingNeighborhoodIteratorType::IndexType 00109 MovingNeighborhoodIndexType; 00110 typedef typename MovingNeighborhoodIteratorType::RadiusType 00111 MovingRadiusType; 00112 typedef NeighborhoodIterator<FixedType> 00113 FixedNeighborhoodIteratorType; 00114 typedef typename FixedNeighborhoodIteratorType::IndexType 00115 FixedNeighborhoodIndexType; 00116 typedef typename FixedNeighborhoodIteratorType::RadiusType 00117 FixedRadiusType; 00118 00119 // IMAGE DATA 00120 typedef typename MovingType::PixelType RefPixelType; 00121 typedef typename FixedType::PixelType TarPixelType; 00122 typedef Float PixelType; 00123 typedef Float ComputationType; 00124 typedef Image<RefPixelType, itkGetStaticConstMacro(ImageDimension)> RefImageType; 00125 typedef Image<TarPixelType, itkGetStaticConstMacro(ImageDimension)> TarImageType; 00126 typedef Image<PixelType, itkGetStaticConstMacro(ImageDimension)> ImageType; 00127 typedef vnl_vector<Float> VectorType; 00128 00129 // Necessary typedefs for dealing with images END 00130 00131 // ------------------------------------------------------------ 00132 // Set up the metrics 00133 // ------------------------------------------------------------ 00134 typedef double 00135 CoordinateRepresentationType; 00136 typedef Transform<CoordinateRepresentationType, itkGetStaticConstMacro(ImageDimension), 00137 itkGetStaticConstMacro(ImageDimension)> TransformBaseType; 00138 typedef TranslationTransform<CoordinateRepresentationType, 00139 itkGetStaticConstMacro(ImageDimension)> DefaultTransformType; 00140 00142 typedef ImageToImageMetric<FixedType, MovingType> MetricBaseType; 00143 typedef typename MetricBaseType::Pointer MetricBaseTypePointer; 00144 00145 typedef MutualInformationImageToImageMetric<MovingType, FixedType> MutualInformationMetricType; 00146 00147 typedef MeanSquaresImageToImageMetric<MovingType, FixedType> MeanSquaresMetricType; 00148 00149 typedef NormalizedCorrelationImageToImageMetric<MovingType, FixedType> NormalizedCorrelationMetricType; 00150 00151 typedef MeanSquaresMetricType DefaultMetricType; 00152 typedef typename DefaultTransformType::ParametersType ParametersType; 00153 typedef typename DefaultTransformType::JacobianType JacobianType; 00154 00155 typedef unsigned long ElementIdentifier; 00156 typedef VectorContainer<ElementIdentifier, Element::Pointer> ElementContainerType; 00157 // ------------------------------------------------------------ 00158 // Set up an Interpolator 00159 // ------------------------------------------------------------ 00160 typedef LinearInterpolateImageFunction<MovingType, double> InterpolatorType; 00161 00163 typedef float RealType; 00164 typedef CovariantVector<RealType, 00165 itkGetStaticConstMacro(ImageDimension)> GradientPixelType; 00166 typedef Image<GradientPixelType, 00167 itkGetStaticConstMacro(ImageDimension)> GradientImageType; 00168 typedef SmartPointer<GradientImageType> GradientImagePointer; 00169 typedef GradientRecursiveGaussianImageFilter<ImageType, 00170 GradientImageType> 00171 GradientImageFilterType; 00172 // typedef typename GradientImageFilterType::Pointer 00173 // GradientImageFilterPointer; 00175 00176 // FUNCTIONS 00177 00179 void SetMetric(MetricBaseTypePointer MP) 00180 { 00181 m_Metric = MP; 00182 } 00183 00185 void SetMovingImage(MovingType *R) 00186 { 00187 m_RefImage = R; 00188 m_RefSize = m_RefImage->GetLargestPossibleRegion().GetSize(); 00189 } 00191 00192 void SetMetricMovingImage(MovingType *R) 00193 { 00194 m_Metric->SetMovingImage(R); 00195 m_RefSize = R->GetLargestPossibleRegion().GetSize(); 00196 } 00197 00199 void SetFixedImage(FixedType *T) 00200 { 00201 m_TarImage = T; 00202 m_TarSize = T->GetLargestPossibleRegion().GetSize(); 00203 } 00205 00206 void SetMetricFixedImage(FixedType *T) 00207 { 00208 m_Metric->SetFixedImage(T); 00209 m_TarSize = T->GetLargestPossibleRegion().GetSize(); 00210 } 00211 00212 MovingPointer GetMovingImage() 00213 { 00214 return m_RefImage; 00215 } 00216 FixedPointer GetFixedImage() 00217 { 00218 return m_TarImage; 00219 } 00220 00222 void SetMetricRadius(MovingRadiusType T) 00223 { 00224 m_MetricRadius = T; 00225 } 00226 00228 MovingRadiusType GetMetricRadius() 00229 { 00230 return m_MetricRadius; 00231 } 00232 00237 void SetNumberOfIntegrationPoints(unsigned int i) 00238 { 00239 m_NumberOfIntegrationPoints = i; 00240 } 00241 unsigned int GetNumberOfIntegrationPoints() 00242 { 00243 return m_NumberOfIntegrationPoints; 00244 } 00246 00250 void SetSign(Float s) 00251 { 00252 m_Sign = s; 00253 } 00254 00256 void SetTemp(Float s) 00257 { 00258 m_Temp = s; 00259 } 00260 00262 void SetGamma(Float s) 00263 { 00264 m_Gamma = s; 00265 } 00266 00270 void SetSolution(Solution::ConstPointer ptr) 00271 { 00272 m_Solution = ptr; 00273 } 00274 00278 Solution::ConstPointer GetSolution() 00279 { 00280 return m_Solution; 00281 } 00282 00286 Float GetMetric(VectorType InVec); 00287 00288 VectorType GetPolynomialFitToMetric(VectorType PositionInElement, VectorType SolutionAtPosition); 00289 00290 VectorType MetricFiniteDiff(VectorType PositionInElement, VectorType SolutionAtPosition); 00291 00292 // FIXME - WE ASSUME THE 2ND VECTOR (INDEX 1) HAS THE INFORMATION WE WANT 00293 Float GetSolution(unsigned int i, unsigned int which = 0) 00294 { 00295 return m_Solution->GetSolutionValue(i, which); 00296 } 00297 00298 // define the copy constructor 00299 // ImageMetricLoad(const ImageMetricLoad& LMS); 00300 00301 void InitializeMetric(void); 00302 00303 ImageMetricLoad(); // cannot be private until we always use smart pointers 00304 Float EvaluateMetricGivenSolution(Element::ArrayType *el, Float step = 1.0); 00305 00306 Float EvaluateMetricGivenSolution1(Element::ArrayType *el, Float step = 1.0); 00307 00311 VectorType Fe(VectorType, VectorType); 00312 00313 static Baseclass * NewImageMetricLoad(void) 00314 { 00315 return new ImageMetricLoad; 00316 } 00317 00319 // void InitializeGradientImage(); 00320 void SetMetricGradientImage(GradientImageType *g) 00321 { 00322 m_MetricGradientImage = g; 00323 } 00324 GradientImageType * GetMetricGradientImage() 00325 { 00326 return m_MetricGradientImage; 00327 } 00329 00330 void PrintCurrentEnergy() 00331 { 00332 std::cout << " energy " << m_Energy << std::endl; 00333 } 00334 double GetCurrentEnergy() 00335 { 00336 return m_Energy; 00337 } 00338 void SetCurrentEnergy(double e) 00339 { 00340 m_Energy = e; 00341 } 00342 00343 // FIXME - Documentation 00344 virtual void ApplyLoad(Element::ConstPointer element, Element::VectorType & Fe); 00345 00346 protected: 00347 virtual void PrintSelf(std::ostream& os, Indent indent) const; 00348 00349 private: 00350 GradientImageType *m_MetricGradientImage; 00351 MovingPointer m_RefImage; 00352 FixedPointer m_TarImage; 00355 typename MovingType::SizeType m_RefSize; 00356 typename FixedType::SizeType m_TarSize; 00357 unsigned int m_NumberOfIntegrationPoints; 00358 unsigned int m_SolutionIndex; 00359 unsigned int m_SolutionIndex2; 00360 Float m_Sign; 00361 Float m_Temp; 00362 Float m_Gamma; 00363 00364 typename Solution::ConstPointer m_Solution; 00365 MetricBaseTypePointer m_Metric; 00366 typename TransformBaseType::Pointer m_Transform; 00367 typename InterpolatorType::Pointer m_Interpolator; 00368 00369 mutable double m_Energy; 00370 private: 00371 00372 }; 00373 } 00374 } // end namespace fem/itk 00375 00376 #ifndef ITK_MANUAL_INSTANTIATION 00377 #include "itkFEMImageMetricLoad.hxx" 00378 #endif 00379 00380 #endif 00381