cmtkLabelCombinationVoting.cxx

Go to the documentation of this file.
00001 /*
00002 //
00003 //  Copyright 1997-2009 Torsten Rohlfing
00004 //  Copyright 2004-2009 SRI International
00005 //
00006 //  This file is part of the Computational Morphometry Toolkit.
00007 //
00008 //  http://www.nitrc.org/projects/cmtk/
00009 //
00010 //  The Computational Morphometry Toolkit is free software: you can
00011 //  redistribute it and/or modify it under the terms of the GNU General Public
00012 //  License as published by the Free Software Foundation, either version 3 of
00013 //  the License, or (at your option) any later version.
00014 //
00015 //  The Computational Morphometry Toolkit is distributed in the hope that it
00016 //  will be useful, but WITHOUT ANY WARRANTY; without even the implied
00017 //  warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
00018 //  GNU General Public License for more details.
00019 //
00020 //  You should have received a copy of the GNU General Public License along
00021 //  with the Computational Morphometry Toolkit.  If not, see
00022 //  <http://www.gnu.org/licenses/>.
00023 //
00024 //  $Revision: 2398 $
00025 //
00026 //  $LastChangedDate: 2010-10-05 14:54:37 -0700 (Tue, 05 Oct 2010) $
00027 //
00028 //  $LastChangedBy: torstenrohlfing $
00029 //
00030 */
00031 
00032 #include <Segmentation/cmtkLabelCombinationVoting.h>
00033 
00034 namespace
00035 cmtk
00036 {
00037 
00040 
00041 LabelCombinationVoting::LabelCombinationVoting( const std::vector<TypedArray::SmartPtr>& data )
00042 {
00043   const size_t nValues = data[ 0 ]->GetDataSize();
00044   m_Result = TypedArray::SmartPtr( TypedArray::Create( TYPE_SHORT, nValues ) );
00045   
00046 #pragma omp parallel for  
00047   for ( size_t i = 0; i < nValues; ++i )
00048     {
00049     short label[256];
00050     memset( label, 0, sizeof( label ) );
00051 
00052     for ( size_t curr = 0; curr < data.size(); ++curr )
00053       {
00054       Types::DataItem v;
00055       if ( data[ curr ]->Get( v, i ) ) 
00056         {
00057         ++label[ static_cast<byte>( v ) ];
00058         }
00059       }
00060 
00061     // Compute winner of label voting.
00062 
00063     int maxLab = 0;
00064     int maxCnt = 0;
00065    
00066     for ( int lab=0; lab < 256; ++lab ) 
00067       {
00068       // do something with tie case
00069       if ( label[ lab ] > maxCnt ) 
00070         {
00071         maxCnt = label[ lab ];
00072         maxLab = lab;
00073         } 
00074       else
00075         {
00076         if ( label[lab] == maxCnt )
00077           {
00078           maxLab = -1;
00079           }
00080         }
00081       }
00082   
00083     this->m_Result->Set( maxLab, i ); 
00084     }
00085 }
00086 
00087 } // namespace cmtk
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Defines