cmtkVoxelMatchingCorrRatio.cxx

Go to the documentation of this file.
00001 /*
00002 //
00003 //  Copyright 1997-2009 Torsten Rohlfing
00004 //
00005 //  Copyright 2004-2010 SRI International
00006 //
00007 //  This file is part of the Computational Morphometry Toolkit.
00008 //
00009 //  http://www.nitrc.org/projects/cmtk/
00010 //
00011 //  The Computational Morphometry Toolkit is free software: you can
00012 //  redistribute it and/or modify it under the terms of the GNU General Public
00013 //  License as published by the Free Software Foundation, either version 3 of
00014 //  the License, or (at your option) any later version.
00015 //
00016 //  The Computational Morphometry Toolkit is distributed in the hope that it
00017 //  will be useful, but WITHOUT ANY WARRANTY; without even the implied
00018 //  warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
00019 //  GNU General Public License for more details.
00020 //
00021 //  You should have received a copy of the GNU General Public License along
00022 //  with the Computational Morphometry Toolkit.  If not, see
00023 //  <http://www.gnu.org/licenses/>.
00024 //
00025 //  $Revision: 2022 $
00026 //
00027 //  $LastChangedDate: 2010-07-21 15:26:03 -0700 (Wed, 21 Jul 2010) $
00028 //
00029 //  $LastChangedBy: torstenrohlfing $
00030 //
00031 */
00032 
00033 #include "cmtkVoxelMatchingCorrRatio.h"
00034 
00035 namespace
00036 cmtk
00037 {
00038 
00041 
00042 template<Interpolators::InterpolationEnum I>
00043 typename VoxelMatchingCorrRatio<I>::ReturnType
00044 VoxelMatchingCorrRatio<I>::Get () const
00045 {
00046   double invSampleCount = 1.0 / HistogramI.SampleCount();
00047   // initialize variable for the weighted sum of the sigma^2 values over all
00048   // reference intensity classes.
00049   double sumSigmaSquare = 0;
00050   // run over all bins, i.e., reference classes
00051   for ( unsigned int j = 0; j < NumBinsX; ++j ) 
00052     {
00053     // are there any values in the current class?
00054     if ( HistogramI[j] ) 
00055       {
00056       // compute mean floating value for this reference class
00057       double mu = SumJ[j] / HistogramI[j];
00058       // compute variance of floating values for this reference class
00059       double sigmaSq = ( mu*mu*HistogramI[j] - 2.0*mu*SumJ[j] + SumJ2[j] ) / HistogramI[j]; 
00060       // update sum over all classes with weighted sigma^2 for this class.
00061       sumSigmaSquare += (invSampleCount * HistogramI[j]) * sigmaSq;
00062       }
00063     }
00064   
00065   // compute (supposedly) correlation ratio
00066   typename Self::ReturnType cr = static_cast<typename Self::ReturnType>( 1.0 - (1.0 /  SigmaSqJ ) * sumSigmaSquare );
00067   
00068   sumSigmaSquare = 0;
00069   for ( unsigned int i = 0; i < NumBinsY; ++i ) 
00070     {
00071     if ( HistogramJ[i] ) 
00072       {
00073       double mu = SumI[i] / HistogramJ[i];
00074       double sigmaSq = ( mu*mu*HistogramJ[i] - 2.0*mu*SumI[i] + SumI2[i] ) / HistogramJ[i]; 
00075       // update sum over all classes with weighted sigma^2 for this class.
00076       sumSigmaSquare += (invSampleCount * HistogramJ[i]) * sigmaSq;
00077       }
00078     }
00079   
00080   // add reverse correlation ratio
00081   cr += static_cast<typename Self::ReturnType>(1.0 - (1.0 /  SigmaSqI ) * sumSigmaSquare);
00082   
00083   return cr;
00084 }
00085 
00087 template class VoxelMatchingCorrRatio<Interpolators::LINEAR>;
00088 
00090 template class VoxelMatchingCorrRatio<Interpolators::NEAREST_NEIGHBOR>;
00091 
00092 } // namespace cmtk
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Defines