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 Segmenter data used by the merger in region growing process. 
 
Segmenter segments IDs manager. 
 
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. 
 
unsigned int m_xStart
Segment left X coordinate box over the label image. 
 
double DissimilarityTypeT
Type for dissimilarity. 
 
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 long int getActiveSegmentsNumber(SegmenterRegionGrowingSegment< FeatureDataTypeT > *const actSegsListHeadPtr)
Returns the number of active segments. 
 
unsigned short int IterationCounterType
Iteration counter type. 
 
void disable()
Disable this segment ( same as m_mergetIteration = std::numeric_limits< SegmenterRegionGrowingSegment...
 
This class can be used to inform the progress of a task. 
 
float BaatzFeatureType
Baatz Strategy feature 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. 
 
unsigned int m_neighborSegmentsSize
The current size of m_neighborSegments. 
 
Segmenter merger used in region growing process. 
 
unsigned int SegmentIdDataType
 
SegmenterRegionGrowingSegment< FeatureDataTypeT > * m_prevActiveSegment
A pointer to the previous active segment. 
 
IterationCounterType m_mergetIteration
The current merge iteration. 
 
virtual void createMergeData(SegmenterRegionGrowingMergeData **mergeDataPtr) const =0
Create a new merge data instance when applicable. 
 
SegmenterRegionGrowingSegment< FeatureDataTypeT > * m_nextActiveSegment
A pointer to the next active segment. 
 
void removeAllNeighborSegmentsPtrs()
Remove all neighbor segments. 
 
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. 
 
Abstract class for the segments merger. 
 
void addNeighborSegmentPtr(SegmenterRegionGrowingSegment< FeatureDataTypeT > *const nSegPtr)
Add a pointer of a neighbor segment (if it is not already there). 
 
SegmenterSegmentsBlock::SegmentIdDataType m_id
Segment ID. 
 
unsigned int m_yStart
Segment upper Y coordinate box over the label image. 
 
Matrix< SegmenterSegmentsBlock::SegmentIdDataType > SegmentsIdsMatrixT
Definition for segments ids matrix type. 
 
SegmenterRegionGrowingSegment< FeatureDataTypeT > ** m_neighborSegments
Neighborhood segments pointers (some pointers can be null) or a null pointer if there is no neighborh...
 
unsigned int m_xBound
Segment lower bound X coordinate box over the label image. 
 
void removeNeighborSegmentPtr(SegmenterRegionGrowingSegment< FeatureDataTypeT > *const nSegPtr)
Remove all occurrences of a neighbor segment. 
 
float MeanFeatureType
Mean Strategy feature type. 
 
virtual void update(SegmenterRegionGrowingSegment< FeatureDataTypeT > *const actSegsListHeadPtr)=0
Update the internal state. 
 
unsigned int m_yBound
Segment lower bound Y coordinate box over the label image. 
 
bool isActive() const
Verify if the task is active. 
 
unsigned int m_size
Segment area (pixels number). 
 
void exportSegs2Tif(const SegmentsIdsMatrixT &segmentsIds, bool normto8bits, const std::string &fileName)
Export the segments IDs to a tif file. 
 
#define TERP_TRUE_OR_THROW(value, message)
Checks if value is true and throws an exception if not. 
 
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. 
 
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.