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;
 
#define TERP_TRUE_OR_THROW(value, message)
Checks if value is true and throws an exception if not.
 
Segmenter merger used in region growing process.
 
This class can be used to inform the progress of a task.
 
bool isActive() const
Verify if the task is active.
 
Segmenter segments IDs manager.
 
Segmenter data used by the merger in region growing process.
 
Abstract class for the segments merger.
 
virtual void update(SegmenterRegionGrowingSegment< FeatureDataTypeT > *const actSegsListHeadPtr)=0
Update the internal state.
 
virtual void mergeFeatures(SegmenterRegionGrowingSegment< FeatureDataTypeT > *const segment1Ptr, SegmenterRegionGrowingSegment< FeatureDataTypeT > const *const segment2Ptr, SegmenterRegionGrowingMergeData const *const mergeDataPtr) const =0
Merge specific segment features from both segments into the first segment.
 
virtual void createMergeData(SegmenterRegionGrowingMergeData **mergeDataPtr) const =0
Create a new merge data instance when applicable.
 
virtual DissimilarityTypeT getDissimilarity(SegmenterRegionGrowingSegment< FeatureDataTypeT > const *const segment1Ptr, SegmenterRegionGrowingSegment< FeatureDataTypeT > const *const segment2Ptr, SegmenterRegionGrowingMergeData *const mergeDataPtr) const =0
Returns a dimilarity index between this and the other segment.
 
unsigned int SegmentIdDataType
 
unsigned long int getActiveSegmentsNumber(SegmenterRegionGrowingSegment< FeatureDataTypeT > *const actSegsListHeadPtr)
Returns the number of active segments.
 
float BaatzFeatureType
Baatz Strategy feature type.
 
float MeanFeatureType
Mean Strategy feature type.
 
unsigned short int IterationCounterType
Iteration counter type.
 
void merge2Segments(SegmenterRegionGrowingSegment< FeatureDataTypeT > *segPtr1, SegmenterRegionGrowingSegment< FeatureDataTypeT > *segPtr2, SegmenterRegionGrowingMergeData const *const mergeDataPtr, SegmentsIdsMatrixT &segmentsIds, SegmenterRegionGrowingMerger< FeatureDataTypeT > &merger, SegmenterRegionGrowingSegment< FeatureDataTypeT > **actSegsListHeadPtrPtr)
Merge segment 2 into segment 1.
 
void exportSegs2Tif(const SegmentsIdsMatrixT &segmentsIds, bool normto8bits, const std::string &fileName)
Export the segments IDs to a tif file.
 
Matrix< SegmenterSegmentsBlock::SegmentIdDataType > SegmentsIdsMatrixT
Definition for segments ids matrix type.
 
bool mergeSegments(const DissimilarityTypeT maxDisimilarityThreshold, const bool enablelocalMutualBestFitting, SegmentsIdsMatrixT &segmentsIds, SegmenterIdsManager &segmenterIdsManager, SegmenterRegionGrowingMerger< FeatureDataTypeT > &merger, IterationCounterType &globalMergeIterationsCounter, const double sameItMergesThreshold, const unsigned int segmentsSimIncreaseSteps, SegmenterRegionGrowingSegment< FeatureDataTypeT > **actSegsListHeadPtrPtr, te::common::TaskProgress *taskProgressPtr)
Merge segments following a maximum dissimilarity thresold.
 
void mergeTooSmallSegments(const unsigned int maximumSegmentSize, SegmentsIdsMatrixT &segmentsIds, SegmenterIdsManager &segmenterIdsManager, SegmenterRegionGrowingMerger< FeatureDataTypeT > &merger, IterationCounterType &globalMergeIterationsCounter, SegmenterRegionGrowingSegment< FeatureDataTypeT > **actSegsListHeadPtrPtr)
Merge too small segments to its closer neighbor.
 
void findMinDissimilaryNeighbor(SegmenterRegionGrowingSegment< FeatureDataTypeT > const *const segPtr, const SegmenterRegionGrowingMerger< FeatureDataTypeT > &merger, SegmenterRegionGrowingMergeData *const auxMergeDataPtr1, SegmenterRegionGrowingMergeData *const auxMergeDataPtr2, SegmenterRegionGrowingSegment< FeatureDataTypeT > **minDissimilarityNeighborPtr, DissimilarityTypeT &minDissimilarityValue, SegmenterRegionGrowingMergeData **minDissimilarityMergeDataPtr)
Locatie the minimim dissimilarity neighbor segment.
 
double DissimilarityTypeT
Type for dissimilarity.
 
void removeAllNeighborSegmentsPtrs()
Remove all neighbor segments.
 
SegmenterRegionGrowingSegment< FeatureDataTypeT > * m_prevActiveSegment
A pointer to the previous active segment.
 
void addNeighborSegmentPtr(SegmenterRegionGrowingSegment< FeatureDataTypeT > *const nSegPtr)
Add a pointer of a neighbor segment (if it is not already there).
 
unsigned int m_neighborSegmentsSize
The current size of m_neighborSegments.
 
void removeNeighborSegmentPtr(SegmenterRegionGrowingSegment< FeatureDataTypeT > *const nSegPtr)
Remove all occurrences of a neighbor segment.
 
SegmenterRegionGrowingSegment< FeatureDataTypeT > * m_nextActiveSegment
A pointer to the next active segment.
 
unsigned int m_xBound
Segment lower bound X coordinate box over the label image.
 
void disable()
Disable this segment ( same as m_mergetIteration = std::numeric_limits< SegmenterRegionGrowingSegment...
 
unsigned int m_yBound
Segment lower bound Y coordinate box over the label image.
 
unsigned int m_xStart
Segment left X coordinate box over the label image.
 
unsigned int m_yStart
Segment upper Y coordinate box over the label image.
 
unsigned int m_size
Segment area (pixels number).
 
IterationCounterType m_mergetIteration
The current merge iteration.
 
SegmenterRegionGrowingSegment< FeatureDataTypeT > ** m_neighborSegments
Neighborhood segments pointers (some pointers can be null) or a null pointer if there is no neighborh...
 
SegmenterSegmentsBlock::SegmentIdDataType m_id
Segment ID.