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