25 #ifndef __TERRALIB_RP_INTERNAL_SEGMENTERREGIONGROWINGFUNCTIONS_H 
   26 #define __TERRALIB_RP_INTERNAL_SEGMENTERREGIONGROWINGFUNCTIONS_H 
   33 #include "../common/progress/TaskProgress.h" 
   71                            bool normto8bits, 
const std::string& fileName );
 
   78       template< 
typename FeatureDataTypeT >
 
   81         unsigned long int returnValue = 0;
 
  103       template< 
typename FeatureDataTypeT >
 
  114         assert( minDissimilarityNeighborPtr );
 
  115         assert( minDissimilarityMergeDataPtr );
 
  117         (*minDissimilarityNeighborPtr) = 0;
 
  118         *minDissimilarityMergeDataPtr = 0;
 
  119         minDissimilarityValue = std::numeric_limits< DissimilarityTypeT >::max();
 
  126         for( 
unsigned int neighborSegIdx = 0 ; neighborSegIdx < neighborSegmentsSize ;
 
  132           if( auxNeighborSegPtr != 0 )
 
  135               auxNeighborSegPtr, currentTempMergeDataPtr );
 
  137             if( currentDissimilarityValue < minDissimilarityValue )
 
  139               minDissimilarityValue = currentDissimilarityValue;
 
  140               (*minDissimilarityNeighborPtr) = auxNeighborSegPtr;
 
  141               (*minDissimilarityMergeDataPtr) = currentTempMergeDataPtr;
 
  143               if( currentTempMergeDataPtr == auxMergeDataPtr1 )
 
  145                 currentTempMergeDataPtr = auxMergeDataPtr2;
 
  149                 currentTempMergeDataPtr = auxMergeDataPtr1;
 
  165       template< 
typename FeatureDataTypeT >
 
  176         assert( actSegsListHeadPtrPtr );
 
  184         const unsigned int& segmentsLineBound = segPtr2->
m_yBound;
 
  185         const unsigned int& segmentColStart = segPtr2->
m_xStart;
 
  186         const unsigned int& segmentColBound = segPtr2->
m_xBound;
 
  190         unsigned int segmentCol = 0;
 
  192         for( 
unsigned int segmentsLine = segPtr2->
m_yStart ;
 
  193              segmentsLine < segmentsLineBound ; ++segmentsLine )
 
  195           segmentsIdsLinePtr = segmentsIds[ segmentsLine ];
 
  197           for( segmentCol = segmentColStart ; segmentCol < segmentColBound ;
 
  201                 segmentsIdsLinePtr[ segmentCol ]
 
  206               segmentsIdsLinePtr[ segmentCol ] = segment1Id;
 
  237         for( 
unsigned int neighborSegIdx = 0 ; neighborSegIdx < neighborSegmentsSize;
 
  248                neighborSegPtr != segPtr1 )
 
  270         if( segPtr2 == (*actSegsListHeadPtrPtr) )
 
  272           (*actSegsListHeadPtrPtr) = (*actSegsListHeadPtrPtr)->m_nextActiveSegment;
 
  274           if( (*actSegsListHeadPtrPtr) ) (*actSegsListHeadPtrPtr)->m_prevActiveSegment = 0;
 
  305       template< 
typename FeatureDataTypeT >
 
  314           "Invalid active segments list header pointer" );
 
  316         if( (*actSegsListHeadPtrPtr) == 0 ) 
return;
 
  320         unsigned long int iterationMergedSegmentsNumber = 0;
 
  324           (*actSegsListHeadPtrPtr);
 
  332         std::unique_ptr< SegmenterRegionGrowingMergeData >
 
  333           backwardDissimilarityAuxMergeDataPtr1(
 
  334           backwardDissimilarityMergeDataPtr );
 
  337         std::unique_ptr< SegmenterRegionGrowingMergeData >
 
  338           backwardDissimilarityAuxMergeDataPtr2(
 
  339           backwardDissimilarityMergeDataPtr );
 
  345           currActSegPtr = (*actSegsListHeadPtrPtr);
 
  348           merger.
update( *actSegsListHeadPtrPtr );
 
  350           iterationMergedSegmentsNumber = 0;
 
  355             if( currActSegPtr->
m_size < maximumSegmentSize )
 
  362                 backwardDissimilarityAuxMergeDataPtr1.get(),
 
  363                 backwardDissimilarityAuxMergeDataPtr2.get(),
 
  364                 &minBackwardDissimilaritySegmentPtr,
 
  365                 minBackwardDissimilarityValue,
 
  366                 &backwardDissimilarityMergeDataPtr );
 
  368               if( minBackwardDissimilaritySegmentPtr )
 
  372                 merge2Segments( minBackwardDissimilaritySegmentPtr, currActSegPtr,
 
  373                   backwardDissimilarityMergeDataPtr, segmentsIds,
 
  374                   merger, actSegsListHeadPtrPtr
 
  377                 minBackwardDissimilaritySegmentPtr->
m_mergetIteration = globalMergeIterationsCounter;
 
  379                 currActSegPtr = nextActSegPtr;
 
  381                 ++iterationMergedSegmentsNumber;
 
  392           } 
while( currActSegPtr );
 
  399           ++globalMergeIterationsCounter;
 
  400         } 
while( iterationMergedSegmentsNumber );
 
  417       template< 
typename FeatureDataTypeT >
 
  419         const bool enablelocalMutualBestFitting,
 
  424         const double sameItMergesThreshold,
 
  425         const unsigned int segmentsSimIncreaseSteps,
 
  430           "Invalid active segments list header pointer" );
 
  432         if( (*actSegsListHeadPtrPtr) == 0 ) 
return true;
 
  437           segmentsSimIncreaseSteps ? maxDisimilarityThreshold / segmentsSimIncreaseSteps
 
  440         unsigned long int maxAchievedMergesPerIteration = 0;
 
  441         unsigned long int currentIterationMergedSegmentsNumber = 0;
 
  443           (*actSegsListHeadPtrPtr);
 
  445         bool enableSameIterationMerges = 
false;
 
  447           segmentsSimIncreaseSteps ? 0 : maxDisimilarityThreshold;
 
  458         merger.
createMergeData( &forwardDissimilarityAuxMergeDataHandler1NPtr );
 
  459         std::unique_ptr< SegmenterRegionGrowingMergeData >
 
  460           forwardDissimilarityAuxMergeDataHandler1(
 
  461           forwardDissimilarityAuxMergeDataHandler1NPtr );
 
  464         merger.
createMergeData( &forwardDissimilarityAuxMergeDataHandler2NPtr );
 
  465         std::unique_ptr< SegmenterRegionGrowingMergeData >
 
  466           forwardDissimilarityAuxMergeDataHandler2(
 
  467           forwardDissimilarityAuxMergeDataHandler2NPtr );
 
  477         std::unique_ptr< SegmenterRegionGrowingMergeData >
 
  478           backwardDissimilarityAuxMergeDataPtr1(
 
  479           backwardDissimilarityMergeDataPtr );
 
  482         std::unique_ptr< SegmenterRegionGrowingMergeData >
 
  483           backwardDissimilarityAuxMergeDataPtr2(
 
  484           backwardDissimilarityMergeDataPtr );
 
  490           currActSegPtr = (*actSegsListHeadPtrPtr);
 
  493           merger.
update( *actSegsListHeadPtrPtr );
 
  495           currentIterationMergedSegmentsNumber = 0;
 
  505                 enableSameIterationMerges
 
  515                 forwardDissimilarityAuxMergeDataHandler1NPtr,
 
  516                 forwardDissimilarityAuxMergeDataHandler2NPtr,
 
  517                 &minForwardDissimilaritySegmentPtr,
 
  518                 minForwardDissimilarityValue,
 
  519                 &minForwardDissimilarityMergeDataPtr );
 
  523                   ( minForwardDissimilaritySegmentPtr )
 
  525                   ( minForwardDissimilarityValue <= currentDisimilarityThreshold )
 
  531                       globalMergeIterationsCounter
 
  534                     enableSameIterationMerges
 
  538                 if( enablelocalMutualBestFitting )
 
  542                     backwardDissimilarityAuxMergeDataPtr1.get(),
 
  543                     backwardDissimilarityAuxMergeDataPtr2.get(),
 
  544                     &minBackwardDissimilaritySegmentPtr,
 
  545                     minBackwardDissimilarityValue,
 
  546                     &backwardDissimilarityMergeDataPtr );
 
  548                   if( minBackwardDissimilaritySegmentPtr != currActSegPtr )
 
  550                     minForwardDissimilaritySegmentPtr = 0;
 
  554                 if( minForwardDissimilaritySegmentPtr )
 
  557                     globalMergeIterationsCounter;
 
  559                   if( currActSegPtr->
m_size > minForwardDissimilaritySegmentPtr->
m_size )
 
  561                     if( nextActSegPtr == minForwardDissimilaritySegmentPtr )
 
  567                       minForwardDissimilarityMergeDataPtr, segmentsIds,
 
  568                       merger, actSegsListHeadPtrPtr
 
  574                       minForwardDissimilarityMergeDataPtr, segmentsIds,
 
  575                       merger, actSegsListHeadPtrPtr
 
  579                   ++currentIterationMergedSegmentsNumber;
 
  585             currActSegPtr = nextActSegPtr;
 
  587           } 
while( currActSegPtr );
 
  589           maxAchievedMergesPerIteration = std::max( currentIterationMergedSegmentsNumber,
 
  590             maxAchievedMergesPerIteration );
 
  602               ((
double)currentIterationMergedSegmentsNumber)
 
  605                ((
double)maxAchievedMergesPerIteration)
 
  607                 ( sameItMergesThreshold / 100.0 )
 
  611             ++seqLowMergesItsNumber;
 
  615             seqLowMergesItsNumber = 0;
 
  618           enableSameIterationMerges = 
false;
 
  620           if( currentIterationMergedSegmentsNumber == 0 )
 
  622             if( currentDisimilarityThreshold ==  maxDisimilarityThreshold )
 
  628               currentDisimilarityThreshold = std::min( maxDisimilarityThreshold,
 
  629                 currentDisimilarityThreshold + disimilarityThresholdStepValue );
 
  631               maxAchievedMergesPerIteration = 0;
 
  634           else if( seqLowMergesItsNumber > 3 )
 
  636             seqLowMergesItsNumber = 0;
 
  637             maxAchievedMergesPerIteration = 0;
 
  639             if( currentDisimilarityThreshold == maxDisimilarityThreshold )
 
  641               enableSameIterationMerges = 
true;
 
  645               currentDisimilarityThreshold = std::min( maxDisimilarityThreshold,
 
  646                 currentDisimilarityThreshold + disimilarityThresholdStepValue );
 
  650           ++globalMergeIterationsCounter;
 
  670 #endif  // __TERRALIB_RP_INTERNAL_SEGMENTERREGIONGROWINGFUNCTIONS_H