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.