00001 /*========================================================================= 00002 00003 Program: Insight Segmentation & Registration Toolkit 00004 Module: $RCSfile: itkCompositeValleyFunction.h,v $ 00005 Language: C++ 00006 Date: $Date: 2007/03/22 14:29:13 $ 00007 Version: $Revision: 1.10 $ 00008 00009 Copyright (c) Insight Software Consortium. All rights reserved. 00010 See ITKCopyright.txt or http://www.itk.org/HTML/Copyright.htm 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 #ifndef __itkCompositeValleyFunction_h 00018 #define __itkCompositeValleyFunction_h 00019 00020 #include "itkArray.h" 00021 #include "itkCacheableScalarFunction.h" 00022 #include <vector> 00023 00024 namespace itk { 00025 00071 class TargetClass 00072 { 00073 public: 00075 TargetClass(double mean, double sigma) 00076 { 00077 m_Mean = mean; 00078 m_Sigma = sigma; 00079 } 00080 00082 void SetMean(double mean) { m_Mean = mean; } 00083 double GetMean() { return m_Mean; } 00085 00087 void SetSigma(double sigma) { m_Sigma = sigma; } 00088 double GetSigma() { return m_Sigma; } 00090 00091 private: 00092 double m_Mean; 00093 double m_Sigma; 00094 }; // end of class 00095 00096 class CompositeValleyFunction : public CacheableScalarFunction 00097 { 00098 public: 00099 00101 typedef CacheableScalarFunction Superclass; 00102 00104 typedef Superclass::MeasureType MeasureType; 00105 typedef Superclass::MeasureArrayType MeasureArrayType; 00106 00108 CompositeValleyFunction( const MeasureArrayType & classMeans, 00109 const MeasureArrayType & classSigmas ); 00110 00112 virtual ~CompositeValleyFunction() {} 00113 00115 double GetUpperBound() { return m_UpperBound; } 00116 00118 double GetLowerBound() { return m_LowerBound; } 00119 00122 MeasureType operator() (MeasureType x) 00123 { 00124 if (x > m_UpperBound || x < m_LowerBound) 00125 { 00126 return 1; 00127 } 00128 00129 if (!this->IsCacheAvailable()) 00130 { 00131 return this->Evaluate(x); 00132 } 00133 else 00134 { 00135 return GetCachedValue(x); 00136 } 00137 } 00138 00140 inline MeasureType Evaluate(MeasureType x) 00141 { 00142 MeasureType res = 1; 00143 00144 for (unsigned int k = 0; k < m_Targets.size(); k++) 00145 { 00146 res *= valley( ( x - m_Targets[k].GetMean() ) / 00147 m_Targets[k].GetSigma() ); 00148 } 00149 00150 return res; 00151 } 00152 00154 inline MeasureType valley(MeasureType d) 00155 { 00156 return 1 - 1 / (1+d*d/3); 00157 } 00158 00159 protected: 00160 void AddNewClass(double mean, double sigma) 00161 { 00162 TargetClass aClass(mean, sigma); 00163 m_Targets.push_back(aClass); 00164 } 00165 00167 void Initialize(); 00168 00169 private: 00171 std::vector<TargetClass> m_Targets; 00172 00175 double m_UpperBound; 00176 00179 double m_LowerBound; 00180 00181 }; // end of class 00182 00183 } // end of namespace itk 00184 #endif 00185