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.