/vol/vipdata/irtk/packages/registration/include/irtkSSDSimilarityMetric.h

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