00001 /*========================================================================= 00002 00003 Library : Image Registration Toolkit (IRTK) 00004 Module : $Id: irtkSSDSimilarityMetric.h 2 2008-12-23 12:40:14Z dr $ 00005 Copyright : Imperial College, Department of Computing 00006 Visual Information Processing (VIP), 2008 onwards 00007 Date : $Date: 2008-12-23 12:40:14 +0000 (Tue, 23 Dec 2008) $ 00008 Version : $Revision: 2 $ 00009 Changes : $Author: dr $ 00010 00011 =========================================================================*/ 00012 00013 #ifndef _IRTKSSDSIMILARITYMETRIC_H 00014 00015 #define _IRTKSSDSIMILARITYMETRIC_H 00016 00022 class irtkSSDSimilarityMetric : public irtkSimilarityMetric 00023 { 00024 00025 private: 00026 00028 double _n; 00029 00031 double _ssd; 00032 00033 public: 00034 00036 irtkSSDSimilarityMetric(); 00037 00039 virtual void Add(int, int); 00040 00042 virtual void Delete(int, int); 00043 00045 virtual void Combine(irtkSimilarityMetric *); 00046 00048 virtual void Reset(); 00049 00051 virtual void Reset(irtkSimilarityMetric *); 00052 00054 virtual double Evaluate(); 00055 00056 }; 00057 00058 inline irtkSSDSimilarityMetric::irtkSSDSimilarityMetric() 00059 { 00060 _ssd = 0; 00061 _n = 0; 00062 } 00063 00064 inline void irtkSSDSimilarityMetric::Add(int x, int y) 00065 { 00066 _ssd += (x-y)*(x-y); 00067 _n++; 00068 } 00069 00070 inline void irtkSSDSimilarityMetric::Delete(int x, int y) 00071 { 00072 _ssd -= (x-y)*(x-y); 00073 _n--; 00074 } 00075 00076 inline void irtkSSDSimilarityMetric::Combine(irtkSimilarityMetric *metric) 00077 { 00078 irtkSSDSimilarityMetric *m = dynamic_cast<irtkSSDSimilarityMetric *>(metric); 00079 00080 if (m == NULL) { 00081 cerr << "irtkSSDSimilarityMetric::Combine: Dynamic cast failed" << endl; 00082 exit(1); 00083 } 00084 00085 _n += m->_n; 00086 _ssd += m->_ssd; 00087 } 00088 00089 00090 inline void irtkSSDSimilarityMetric::Reset() 00091 { 00092 _ssd = 0; 00093 _n = 0; 00094 } 00095 00096 inline void irtkSSDSimilarityMetric::Reset(irtkSimilarityMetric *metric) 00097 { 00098 irtkSSDSimilarityMetric *m = dynamic_cast<irtkSSDSimilarityMetric *>(metric); 00099 00100 if (m == NULL) { 00101 cerr << "irtkSSDSimilarityMetric::Reset: Dynamic cast failed" << endl; 00102 exit(1); 00103 } 00104 00105 _ssd = m->_ssd; 00106 _n = m->_n; 00107 } 00108 00109 inline double irtkSSDSimilarityMetric::Evaluate() 00110 { 00111 if (_n > 0) { 00112 return - _ssd / _n; 00113 } else { 00114 cerr << "irtkSSDSimilarityMetric::Evaluate: No samples"; 00115 return 0; 00116 } 00117 } 00118 00119 #endif