cmtkGaussianKernel.h

Go to the documentation of this file.
00001 /*
00002 //
00003 //  Copyright 2010 SRI International
00004 //
00005 //  This file is part of the Computational Morphometry Toolkit.
00006 //
00007 //  http://www.nitrc.org/projects/cmtk/
00008 //
00009 //  The Computational Morphometry Toolkit is free software: you can
00010 //  redistribute it and/or modify it under the terms of the GNU General Public
00011 //  License as published by the Free Software Foundation, either version 3 of
00012 //  the License, or (at your option) any later version.
00013 //
00014 //  The Computational Morphometry Toolkit is distributed in the hope that it
00015 //  will be useful, but WITHOUT ANY WARRANTY; without even the implied
00016 //  warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
00017 //  GNU General Public License for more details.
00018 //
00019 //  You should have received a copy of the GNU General Public License along
00020 //  with the Computational Morphometry Toolkit.  If not, see
00021 //  <http://www.gnu.org/licenses/>.
00022 //
00023 //  $Revision: 2672 $
00024 //
00025 //  $LastChangedDate: 2010-12-15 14:40:41 -0800 (Wed, 15 Dec 2010) $
00026 //
00027 //  $LastChangedBy: torstenrohlfing $
00028 //
00029 */
00030 
00031 #ifndef __cmtkGaussianKernel_h_included_
00032 #define __cmtkGaussianKernel_h_included_
00033 
00034 #include <cmtkconfig.h>
00035 
00036 #include <Base/cmtkUnits.h>
00037 #include <Base/cmtkMathUtil.h>
00038 
00039 #include <vector>
00040 
00043 
00044 namespace
00045 cmtk
00046 {
00047 
00049 template<class TFloat=double>
00050 class GaussianKernel
00051 {
00052 public:
00054   typedef GaussianKernel<TFloat> Self;
00055 
00057   static std::vector<TFloat> GetSymmetricKernel( const Units::GaussianSigma& sigma , 
00058                                                  const TFloat maxError = 1e-5  )
00059   {
00060     const double normFactor = 1.0/(sqrt(2*M_PI) * sigma.Value());
00061     const size_t radius = Self::GetRadius( sigma, normFactor, maxError );
00062     
00063     std::vector<TFloat> kernel( 2 * radius + 1 );
00064     for ( size_t i = 0; i <= radius; ++i )
00065       {
00066       kernel[radius-i] = kernel[radius+i] = normFactor * exp( -MathUtil::Square( 1.0 * i / sigma.Value() ) / 2 );
00067       }
00068 
00069     return kernel;
00070   }
00071 
00073   static std::vector<TFloat> GetHalfKernel( const Units::GaussianSigma& sigma , 
00074                                             const TFloat maxError = 1e-5  )
00075   {
00076     const double normFactor = 1.0/(sqrt(2*M_PI) * sigma.Value());
00077     const size_t radius = static_cast<size_t>( Self::GetRadius( sigma, normFactor, maxError ) );
00078     
00079     std::vector<TFloat> kernel( radius + 1 );
00080     for ( size_t i = 0; i <= radius; ++i )
00081       {
00082       kernel[i] = normFactor * exp( -MathUtil::Square( 1.0 * i / sigma.Value() ) / 2 );
00083       }
00084     
00085     return kernel;
00086   }
00087 
00088 private:
00090   static TFloat GetRadius(  const Units::GaussianSigma& sigma, const TFloat normFactor, const TFloat maxError )
00091   {
00092     if ( maxError >= normFactor ) // if normFactor is less than max error, then we really need no kernel at all
00093       return 0;
00094     else
00095       return static_cast<size_t>( sqrt( -2.0 * log( maxError / normFactor ) ) * sigma.Value() );
00096   }
00097 };
00098 
00099 } // namespace cmtk
00100 
00102 
00103 #endif // #ifndef __cmtkGaussianKernel_h_included_
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Defines