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 #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 )
00093 return 0;
00094 else
00095 return static_cast<size_t>( sqrt( -2.0 * log( maxError / normFactor ) ) * sigma.Value() );
00096 }
00097 };
00098
00099 }
00100
00102
00103 #endif // #ifndef __cmtkGaussianKernel_h_included_