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

00001 /*=========================================================================
00002 
00003   Library   : Image Registration Toolkit (IRTK)
00004   Module    : $Id: irtkCrossCorrelationSimilarityMetric.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 _IRTKCROSSCORRELATIONSIMILARITYMETRIC_H
00014 
00015 #define _IRTKCROSSCORRELATIONSIMILARITYMETRIC_H
00016 
00022 class irtkCrossCorrelationSimilarityMetric : public irtkSimilarityMetric
00023 {
00024 
00025 private:
00026 
00028   double _n;
00029 
00031   double _xy, _x, _y, _x2, _y2;
00032 
00033 public:
00034 
00036   irtkCrossCorrelationSimilarityMetric();
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 irtkCrossCorrelationSimilarityMetric::irtkCrossCorrelationSimilarityMetric()
00059 {
00060   _xy = 0;
00061   _x  = 0;
00062   _y  = 0;
00063   _x2 = 0;
00064   _y2 = 0;
00065   _n  = 0;
00066 }
00067 
00068 inline void irtkCrossCorrelationSimilarityMetric::Add(int x, int y)
00069 {
00070   _xy += x*y;
00071   _x  += x;
00072   _x2 += x*x;
00073   _y  += y;
00074   _y2 += y*y;
00075   _n++;
00076 }
00077 
00078 inline void irtkCrossCorrelationSimilarityMetric::Delete(int x, int y)
00079 {
00080   _xy -= x*y;
00081   _x  -= x;
00082   _x2 -= x*x;
00083   _y  -= y;
00084   _y2 -= y*y;
00085   _n--;
00086 }
00087 
00088 inline void irtkCrossCorrelationSimilarityMetric::Combine(irtkSimilarityMetric *metric)
00089 {
00090   irtkCrossCorrelationSimilarityMetric *m = dynamic_cast<irtkCrossCorrelationSimilarityMetric *>(metric);
00091 
00092   if (m == NULL) {
00093     cerr << "irtkCrossCorrelationSimilarityMetric::Combine: Dynamic cast failed" << endl;
00094     exit(1);
00095   }
00096 
00097   _xy += m->_xy;
00098   _x2 += m->_x2;
00099   _y2 += m->_y2;
00100   _x  += m->_x;
00101   _y  += m->_y;
00102   _n  += m->_n;
00103 
00104 }
00105 
00106 
00107 inline void irtkCrossCorrelationSimilarityMetric::Reset()
00108 {
00109   _xy = 0;
00110   _x2 = 0;
00111   _y2 = 0;
00112   _x  = 0;
00113   _y  = 0;
00114   _n  = 0;
00115 }
00116 
00117 inline void irtkCrossCorrelationSimilarityMetric::Reset(irtkSimilarityMetric *metric)
00118 {
00119   irtkCrossCorrelationSimilarityMetric *m = dynamic_cast<irtkCrossCorrelationSimilarityMetric *>(metric);
00120 
00121   if (m == NULL) {
00122     cerr << "irtkCrossCorrelationSimilarityMetric::Reset: Dynamic cast failed" << endl;
00123     exit(1);
00124   }
00125 
00126   _xy = m->_xy;
00127   _x  = m->_x;
00128   _x2 = m->_x2;
00129   _y  = m->_y;
00130   _y2 = m->_y2;
00131   _n  = m->_n;
00132 }
00133 
00134 inline double irtkCrossCorrelationSimilarityMetric::Evaluate()
00135 {
00136   if (_n > 0) {
00137     return (_xy - (_x * _y) / _n) / (sqrt(_x2 - _x * _x / _n) * sqrt(_y2 - _y *_y / _n));
00138   } else {
00139     cerr << "irtkCrossCorrelationSimilarityMetric::Evaluate: No samples";
00140     return 0;
00141   }
00142 }
00143 
00144 #endif