cmtkLabelCombinationSTAPLE.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 "cmtkLabelCombinationSTAPLE.h"
00034 
00035 namespace
00036 cmtk
00037 {
00038 
00041 
00042 LabelCombinationSTAPLE::LabelCombinationSTAPLE( const std::vector<TypedArray::SmartPtr>& data, const int maxIterations, const ScalarDataType resultType )
00043 {
00044   const size_t numberOfInputs = data.size();
00045   const size_t numberOfPixels = data[ 0 ]->GetDataSize();
00046   this->m_Result = TypedArray::SmartPtr( TypedArray::Create( resultType, numberOfPixels ) );
00047 
00048   // compute initial estimate as the average of all inputs;
00049   // this is also the first E-step with all p/q equal to 0.5
00050   float totalSum = 0;
00051 #pragma omp parallel for reduction(+:totalSum)
00052   for ( size_t n = 0; n < numberOfPixels; ++n )
00053     {
00054     Types::DataItem w = 0;
00055     for ( size_t i = 0; i < numberOfInputs; ++i )
00056       {
00057       Types::DataItem value;
00058       if ( data[i]->Get( value, n ) )
00059         {
00060         w += value;
00061         totalSum += value;
00062         }
00063       }
00064     this->m_Result->Set( w / numberOfInputs, n );
00065     }
00066 
00067   // global prior probability
00068   const float globalPrior = totalSum / (numberOfInputs * numberOfPixels );
00069 
00070   // expert parameters
00071   this->m_VecP.resize( numberOfInputs );
00072   this->m_VecQ.resize( numberOfInputs );
00073 
00074   // iterate
00075   for ( int it = 0; it < maxIterations; ++it )
00076     {
00077     // M-step
00078     for ( size_t i = 0; i < numberOfInputs; ++i ) 
00079       {
00080       this->m_VecP[i] = this->m_VecQ[i] = 0;
00081       }
00082 
00083     float sumW = 0;
00084     for ( size_t n = 0; n < numberOfPixels; ++n )
00085       {
00086       Types::DataItem w;
00087       this->m_Result->Get( w, n );
00088       sumW += w;
00089       
00090       for ( size_t i = 0; i < numberOfInputs; ++i ) 
00091         {
00092         Types::DataItem value;
00093         data[i]->Get( value, n );
00094         this->m_VecP[i] += w * value;
00095         this->m_VecQ[i] += (1.0 - w) * (1.0 - value);
00096         }
00097       }
00098 
00099     for ( size_t i = 0; i < numberOfInputs; ++i ) 
00100       {
00101       this->m_VecP[i] /= sumW;
00102       this->m_VecQ[i] /= (numberOfPixels - sumW);
00103       }
00104 
00105     // E-step
00106 #pragma omp parallel for
00107     for ( size_t n = 0; n < numberOfPixels; ++n )
00108       {
00109       float alpha = globalPrior;
00110       float beta = (1.0-globalPrior);
00111     
00112       Types::DataItem w = 0;
00113       for ( size_t i = 0; i < numberOfInputs; ++i )
00114         {
00115         if ( data[i]->Get( w, n ) )
00116           {
00117           alpha *= (1-w-m_VecP[i]);
00118           beta *= (w-m_VecQ[i]);
00119           }
00120         }
00121       this->m_Result->Set( alpha / (alpha+beta), n );
00122       }
00123     }
00124 }
00125 
00126 } // namespace cmtk
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Defines