cmtkTypedArrayNoiseEstimatorNaiveGaussian.cxx

Go to the documentation of this file.
00001 /*
00002 //
00003 //  Copyright 2008-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: 2022 $
00024 //
00025 //  $LastChangedDate: 2010-07-21 15:26:03 -0700 (Wed, 21 Jul 2010) $
00026 //
00027 //  $LastChangedBy: torstenrohlfing $
00028 //
00029 */
00030 
00031 #include "cmtkTypedArrayNoiseEstimatorNaiveGaussian.h"
00032 
00033 namespace
00034 cmtk
00035 {
00036 
00037 TypedArrayNoiseEstimatorNaiveGaussian::TypedArrayNoiseEstimatorNaiveGaussian
00038 ( const TypedArray* data, const size_t histogramBins )
00039 {
00040   Histogram<unsigned int>::SmartPtr histogram( data->GetHistogram( histogramBins ) );
00041   
00042   // find first maximum
00043   size_t idx = 0;
00044   while ( (idx < (histogramBins-1)) && ( (*histogram)[idx] <= (*histogram)[idx+1] ) )
00045     {
00046     ++idx;
00047     }
00048   
00049   const Types::DataItem noiseMean = histogram->BinToValue( idx );
00050   
00051   // now find following minimum
00052   while ( (idx < (histogramBins-1)) && ( (*histogram)[idx] > (*histogram)[idx+1] ) )
00053     {
00054     ++idx;
00055     }
00056   
00057   // then, compute standard deviation of all values below that threshold from
00058   // first maximum.
00059   const Types::DataItem threshold = histogram->BinToValue( idx );
00060 
00061   Types::DataItem sdev = 0;
00062   size_t count = 0;
00063   for ( size_t i = 0; i < data->GetDataSize(); ++i )
00064     {
00065     Types::DataItem value;
00066     if ( data->Get( value, i ) )
00067       {
00068       if ( value <= threshold )
00069         {
00070         sdev += static_cast<Types::DataItem>( MathUtil::Square( value - noiseMean ) );
00071         ++count;
00072         }
00073       }
00074     }
00075 
00076   if ( count )
00077     this->m_NoiseLevelSigma = static_cast<Types::DataItem>( sqrt( sdev/count ) );
00078   else
00079     this->m_NoiseLevelSigma = 0.0;
00080 }
00081 
00082 } // namespace cmtk
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Defines