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.