25 #ifndef __TERRALIB_RP_INTERNAL_SEGMENTERREGIONGROWINGFUNCTIONS_H    26 #define __TERRALIB_RP_INTERNAL_SEGMENTERREGIONGROWINGFUNCTIONS_H    68                            bool normto8bits, 
const std::string& fileName );
    75       template< 
typename FeatureDataTypeT >
    78         unsigned int returnValue = 0;
   108       template< 
typename FeatureDataTypeT >
   111         const unsigned int maxSegSizeThreshold,
   114         const bool enablelocalMutualBestFitting,
   115         const bool enableSameIterationMerges,
   121         unsigned int& totalMergesNumber,
   122         IterationCounterType& globalMergeIterationsCounter,
   125         TERP_TRUE_OR_THROW( actSegsListHeadPtrPtr != 0, 
"Invalid active segments list header pointer" );
   126         TERP_TRUE_OR_THROW( (*actSegsListHeadPtrPtr) != 0, 
"Invalid active segments list header pointer" );
   128         minFoundDissimilarity = std::numeric_limits< DissimilarityTypeT >::max();
   130         totalMergesNumber = 0;
   134         unsigned int internalMaxSegSizeThreshold = maxSegSizeThreshold;
   136         if( maxSegSizeThreshold ) {
   137           internalDisimilarityThreshold = std::numeric_limits< DissimilarityTypeT >::max();
   140           internalMaxSegSizeThreshold = std::numeric_limits< unsigned int >::max();
   144         unsigned int iterationMergedSegmentsNumber = 0;
   145         unsigned int segmentsLine = 0;
   146         unsigned int segmentsLineBound = 0;
   147         unsigned int segmentCol = 0;
   148         unsigned int segmentColStart = 0;
   149         unsigned int segmentColBound = 0;
   158         std::list< SegmenterSegmentsBlock::SegmentIdDataType > freeSegmentIds;
   159         unsigned int neighborSegIdx = 0;
   164           iterationMergedSegmentsNumber = 0;
   165           currActSegPtr = (*actSegsListHeadPtrPtr);
   168           merger.
update( *actSegsListHeadPtrPtr );
   172             if( ( enableSameIterationMerges || ( currActSegPtr->
m_mergetIteration < globalMergeIterationsCounter ) )
   174             ( currActSegPtr->
m_size <= internalMaxSegSizeThreshold ) ) {
   179               minForwardDissimilaritySegmentPtr = 0;
   180               minForwardDissimilarityValue = std::numeric_limits< DissimilarityTypeT >::max();
   190                   if( ( forwardDissimilarityValue <= internalDisimilarityThreshold )
   192                       ( forwardDissimilarityValue < minForwardDissimilarityValue ) ) {
   193                     minForwardDissimilarityValue = forwardDissimilarityValue;
   194                     minForwardDissimilaritySegmentPtr = currActSegPtr->
m_neighborSegments[ neighborSegIdx ];
   195                     auxSeg3Ptr->operator=( *auxSeg1Ptr );
   202               if( enablelocalMutualBestFitting && ( minForwardDissimilaritySegmentPtr != 0 ) ) {
   205                 minBackwardDissimilaritySegmentPtr = 0;
   206                 backwardDissimilarityValue = 0;
   207                 minBackwardDissimilarityValue = std::numeric_limits< DissimilarityTypeT >::max();
   209                 for( neighborSegIdx = 0 ;
   215                     backwardDissimilarityValue = 
   220                     if( backwardDissimilarityValue < minBackwardDissimilarityValue ) {
   221                       minBackwardDissimilarityValue = backwardDissimilarityValue;
   222                       minBackwardDissimilaritySegmentPtr = 
   228                 if( minBackwardDissimilaritySegmentPtr !=  currActSegPtr ) {
   229                   minForwardDissimilaritySegmentPtr = 0;
   234               if( ( minForwardDissimilaritySegmentPtr != 0 ) 
   236               ( enableSameIterationMerges ||
   237                 ( minForwardDissimilaritySegmentPtr->
m_mergetIteration < globalMergeIterationsCounter ) 
   240                 if( minFoundDissimilarity > minForwardDissimilarityValue ) {
   241                   minFoundDissimilarity = minForwardDissimilarityValue;
   244                 if( maxFoundDissimilarity < minForwardDissimilarityValue ) {
   245                   maxFoundDissimilarity = minForwardDissimilarityValue;
   253                           minForwardDissimilaritySegmentPtr,
   263                 for( neighborSegIdx = 0 ;
   270                      ( minForwardDissimilaritySegmentPtr->
m_neighborSegments[ neighborSegIdx ] != currActSegPtr ) ) {
   281                     minForwardDissimilaritySegmentPtr->
m_neighborSegments[ neighborSegIdx ]->addNeighborSegmentPtr( 
   286                     minForwardDissimilaritySegmentPtr->
m_neighborSegments[ neighborSegIdx ]->removeNeighborSegmentPtr( 
   287                       minForwardDissimilaritySegmentPtr );
   293                 segmentsLineBound = minForwardDissimilaritySegmentPtr->
m_yBound;
   294                 segmentColStart = minForwardDissimilaritySegmentPtr->
m_xStart;
   295                 segmentColBound = minForwardDissimilaritySegmentPtr->
m_xBound;          
   296                 currentSegmentId = currActSegPtr->
m_id;
   298                 for( segmentsLine = minForwardDissimilaritySegmentPtr->
m_yStart ; 
   299                      segmentsLine < segmentsLineBound ; ++segmentsLine ) {
   300                   segmentsIdsLinePtr = segmentsIds[ segmentsLine ];
   302                   for( segmentCol = segmentColStart ; segmentCol < segmentColBound ; ++segmentCol ) {
   303                     if( segmentsIdsLinePtr[ segmentCol ] ==
   304                   minForwardDissimilaritySegmentPtr->
m_id ) {
   305                       segmentsIdsLinePtr[ segmentCol ] = currentSegmentId;
   313                 if( minForwardDissimilaritySegmentPtr == (*actSegsListHeadPtrPtr) ) {
   314                   (*actSegsListHeadPtrPtr) = (*actSegsListHeadPtrPtr)->m_nextActiveSegment;
   327                 minForwardDissimilaritySegmentPtr->
disable();
   331                 freeSegmentIds.push_back( minForwardDissimilaritySegmentPtr->
m_id );
   333                 ++iterationMergedSegmentsNumber;
   340           } 
while( currActSegPtr );
   344           if( ! freeSegmentIds.empty() ) {
   345             segmenterIdsManager.
addFreeIDs( freeSegmentIds );
   346             freeSegmentIds.clear();
   349           totalMergesNumber += iterationMergedSegmentsNumber;
   354           ++globalMergeIterationsCounter;
   356         } 
while( iterationMergedSegmentsNumber &&
   357            ( globalMergeIterationsCounter <
   358              std::numeric_limits< IterationCounterType >::max() ) );
   364 #endif  // __TERRALIB_RP_INTERNAL_SEGMENTERREGIONGROWINGFUNCTIONS_H unsigned int getActiveSegmentsNumber(SegmenterRegionGrowingSegment< FeatureDataTypeT > *const actSegsListHeadPtr)
Returns the number of active segments. 
 
Segmenter segments IDs manager. 
 
unsigned int m_xStart
Segment left X coordinate box over the label image. 
 
virtual void mergeFeatures(SegmenterRegionGrowingSegment< FeatureDataTypeT > *const segment1Ptr, SegmenterRegionGrowingSegment< FeatureDataTypeT > const *const segment2Ptr, SegmenterRegionGrowingSegment< FeatureDataTypeT > const *const mergePreviewSegPtr) const  =0
Merge specific segment features from both segments into the first segment. 
 
double DissimilarityTypeT
Type for dissimilarity. 
 
unsigned short int IterationCounterType
Iteration counter type. 
 
void disable()
Disable this segment ( same as m_mergetIteration = std::numeric_limits< SegmenterRegionGrowingSegment...
 
void mergeSegments(SegmentsIdsMatrixT &segmentsIds, const DissimilarityTypeT disimilarityThreshold, const unsigned int maxSegSizeThreshold, SegmenterIdsManager &segmenterIdsManager, SegmenterRegionGrowingMerger< FeatureDataTypeT > &merger, const bool enablelocalMutualBestFitting, const bool enableSameIterationMerges, SegmenterRegionGrowingSegment< FeatureDataTypeT > *auxSeg1Ptr, SegmenterRegionGrowingSegment< FeatureDataTypeT > *auxSeg2Ptr, SegmenterRegionGrowingSegment< FeatureDataTypeT > *auxSeg3Ptr, DissimilarityTypeT &minFoundDissimilarity, DissimilarityTypeT &maxFoundDissimilarity, unsigned int &totalMergesNumber, IterationCounterType &globalMergeIterationsCounter, SegmenterRegionGrowingSegment< FeatureDataTypeT > **const actSegsListHeadPtrPtr)
Merge closest segments. 
 
float BaatzFeatureType
Baatz Strategy feature type. 
 
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 DissimilarityTypeT getDissimilarity(SegmenterRegionGrowingSegment< FeatureDataTypeT > const *const segment1Ptr, SegmenterRegionGrowingSegment< FeatureDataTypeT > const *const segment2Ptr, SegmenterRegionGrowingSegment< FeatureDataTypeT > *const mergePreviewSegPtr) const  =0
Returns a dimilarity index between this and the other segment. 
 
SegmenterRegionGrowingSegment< FeatureDataTypeT > * m_nextActiveSegment
A pointer to the next active segment. 
 
void removeAllNeighborSegmentsPtrs()
Remove all neighbor segments. 
 
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. 
 
unsigned int m_size
Segment area (pixels number). 
 
void addFreeIDs(const std::vector< SegmenterSegmentsBlock::SegmentIdDataType > &ids)
Stores free unique IDs for later use. 
 
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.