Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033 #ifndef __cmtkVoxelMatchingCrossCorrelation_h_included_
00034 #define __cmtkVoxelMatchingCrossCorrelation_h_included_
00035
00036 #include <cmtkconfig.h>
00037
00038 #include <Registration/cmtkVoxelMatchingMetric.h>
00039
00040 #include <Base/cmtkUniformVolume.h>
00041 #include <Base/cmtkTypedArray.h>
00042 #include <Base/cmtkMathUtil.h>
00043
00044 #include <System/cmtkSmartPtr.h>
00045
00046 namespace
00047 cmtk
00048 {
00049
00052
00053 #ifdef _MSC_VER
00054 #pragma warning (disable:4521)
00055 #endif
00056
00059 class VoxelMatchingCrossCorrelation :
00061 public VoxelMatchingMetricShort
00062 {
00063 public:
00065 typedef VoxelMatchingCrossCorrelation Self;
00066
00068 typedef SmartPointer<Self> SmartPtr;
00069
00072 VoxelMatchingCrossCorrelation() {};
00073
00079 VoxelMatchingCrossCorrelation ( const UniformVolume* refVolume, const UniformVolume* fltVolume );
00080
00083 template<class T> void Increment( const T a, const T b )
00084 {
00085 if ( (a != DataX.padding()) && (b != DataY.padding()) )
00086 {
00087 ++Samples;
00088 SumX += a;
00089 SumY += b;
00090 SumSqX += a * a;
00091 SumSqY += b * b;
00092 SumXY += a * b;
00093 }
00094 }
00095
00098 template<class T> void Decrement( const T a, const T b )
00099 {
00100 if ( (a != DataX.padding()) && (b != DataY.padding()) )
00101 {
00102 --Samples;
00103 SumX -= a;
00104 SumY -= b;
00105 SumSqX -= a * a;
00106 SumSqY -= b * b;
00107 SumXY -= a * b;
00108 }
00109 }
00110
00112 void Reset ()
00113 {
00114 SumX = SumY = SumSqX = SumSqY = SumXY = 0;
00115 Samples = 0;
00116 }
00117
00119 Self::ReturnType Get() const;
00120
00121 void AddMetric ( const Self& other )
00122 {
00123 SumX += other.SumX;
00124 SumY += other.SumY;
00125 SumXY += other.SumXY;
00126 SumSqX += other.SumSqX;
00127 SumSqY += other.SumSqY;
00128 Samples += other.Samples;
00129 }
00130
00131 void RemoveMetric ( const Self& other )
00132 {
00133 assert( Samples >= other.Samples );
00134 SumX -= other.SumX;
00135 SumY -= other.SumY;
00136 SumXY -= other.SumXY;
00137 SumSqX -= other.SumSqX;
00138 SumSqY -= other.SumSqY;
00139 Samples -= other.Samples;
00140 }
00141
00142 private:
00144 double SumX;
00145
00147 double SumY;
00148
00150 double SumXY;
00151
00153 double SumSqX;
00154
00156 double SumSqY;
00157
00159 size_t Samples;
00160 };
00161
00163
00164 }
00165
00166 #endif // #ifndef __cmtkVoxelMatchingCrossCorrelation_h_included_