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