SegmenterRegionGrowingFunctions.h
Go to the documentation of this file.
1 /* Copyright (C) 2015 National Institute For Space Research (INPE) - Brazil.
2 
3  This file is part of the TerraLib - a Framework for building GIS enabled applications.
4 
5  TerraLib is free software: you can redistribute it and/or modify
6  it under the terms of the GNU Lesser General Public License as published by
7  the Free Software Foundation, either version 3 of the License,
8  or (at your option) any later version.
9 
10  TerraLib is distributed in the hope that it will be useful,
11  but WITHOUT ANY WARRANTY; without even the implied warranty of
12  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13  GNU Lesser General Public License for more details.
14 
15  You should have received a copy of the GNU Lesser General Public License
16  along with TerraLib. See COPYING. If not, write to
17  TerraLib Team at <terralib-team@terralib.org>.
18  */
19 
20 /*!
21  \file terralib/rp/SegmenterRegionGrowingfunctions.h
22  \brief Useful functions for Region Growing segmentation.
23  */
24 
25 #ifndef __TERRALIB_RP_INTERNAL_SEGMENTERREGIONGROWINGFUNCTIONS_H
26 #define __TERRALIB_RP_INTERNAL_SEGMENTERREGIONGROWINGFUNCTIONS_H
27 
28 #include "Matrix.h"
29 #include "SegmenterIdsManager.h"
32 #include "SegmenterSegmentsBlock.h"
33 #include "../common/progress/TaskProgress.h"
34 
35 #include <cstring>
36 
37 namespace te
38 {
39  namespace rp
40  {
41  namespace rg
42  {
43  /*!
44  \brief Definition for segments ids matrix type.
45  */
48 
49  /*!
50  \brief Iteration counter type.
51  */
52  typedef unsigned short int IterationCounterType;
53 
54  /*!
55  \brief Mean Strategy feature type.
56  */
57  typedef float MeanFeatureType;
58 
59  /*!
60  \brief Baatz Strategy feature type.
61  */
62  typedef float BaatzFeatureType;
63 
64  /*!
65  \brief Export the segments IDs to a tif file.
66  \param segmentsIds The output segment ids container.
67  \param normto8bits If true, a 8 bits file will be generated.
68  \param fileName The output tif file name.
69  */
70  void exportSegs2Tif( const SegmentsIdsMatrixT& segmentsIds,
71  bool normto8bits, const std::string& fileName );
72 
73  /*!
74  \brief Returns the number of active segments.
75  \param actSegsListHeadPtr A pointer the the active segments list head.
76  \return Returns the number of active segments.
77  */
78  template< typename FeatureDataTypeT >
79  unsigned long int getActiveSegmentsNumber( SegmenterRegionGrowingSegment< FeatureDataTypeT >* const actSegsListHeadPtr )
80  {
81  unsigned long int returnValue = 0;
82 
83  SegmenterRegionGrowingSegment< FeatureDataTypeT >* currSegPtr = actSegsListHeadPtr;
84 
85  while( currSegPtr ) {
86  ++returnValue;
87  currSegPtr = currSegPtr->m_nextActiveSegment;
88  }
89 
90  return returnValue;
91  }
92 
93  /*!
94  \brief Locatie the minimim dissimilarity neighbor segment.
95  \param segPtr Target segment pointer
96  \param merger Merger instance refecence.
97  \param minDissimilarityNeighborPtr Found neighbor semgnet pointer or null pointer if not found.
98  \param minDissimilarityValue The found dissimilarity value.
99  \param auxMergeDataPtr1 A pointer to a valid input merge data object.
100  \param auxMergeDataPtr2 A pointer to a second valid input merge data object.
101  \param minDissimilarityMergeDataPtr This pointer will be set to point to one of the given auxiliary merge data updated with the current minimum forward segment parameters.
102  */
103  template< typename FeatureDataTypeT >
107  SegmenterRegionGrowingMergeData* const auxMergeDataPtr1,
108  SegmenterRegionGrowingMergeData* const auxMergeDataPtr2,
109  SegmenterRegionGrowingSegment< FeatureDataTypeT >** minDissimilarityNeighborPtr,
110  DissimilarityTypeT& minDissimilarityValue,
111  SegmenterRegionGrowingMergeData** minDissimilarityMergeDataPtr )
112  {
113  assert( segPtr );
114  assert( minDissimilarityNeighborPtr );
115  assert( minDissimilarityMergeDataPtr );
116 
117  (*minDissimilarityNeighborPtr) = 0;
118  *minDissimilarityMergeDataPtr = 0;
119  minDissimilarityValue = std::numeric_limits< DissimilarityTypeT >::max();
120 
121  const unsigned int& neighborSegmentsSize = segPtr->m_neighborSegmentsSize;
123  DissimilarityTypeT currentDissimilarityValue = 0;
124  SegmenterRegionGrowingMergeData* currentTempMergeDataPtr = auxMergeDataPtr1;
125 
126  for( unsigned int neighborSegIdx = 0 ; neighborSegIdx < neighborSegmentsSize ;
127  ++neighborSegIdx )
128  {
129  auxNeighborSegPtr = segPtr->m_neighborSegments[
130  neighborSegIdx ];
131 
132  if( auxNeighborSegPtr != 0 )
133  {
134  currentDissimilarityValue = merger.getDissimilarity( segPtr,
135  auxNeighborSegPtr, currentTempMergeDataPtr );
136 
137  if( currentDissimilarityValue < minDissimilarityValue )
138  {
139  minDissimilarityValue = currentDissimilarityValue;
140  (*minDissimilarityNeighborPtr) = auxNeighborSegPtr;
141  (*minDissimilarityMergeDataPtr) = currentTempMergeDataPtr;
142 
143  if( currentTempMergeDataPtr == auxMergeDataPtr1 )
144  {
145  currentTempMergeDataPtr = auxMergeDataPtr2;
146  }
147  else
148  {
149  currentTempMergeDataPtr = auxMergeDataPtr1;
150  }
151  }
152  }
153  }
154  }
155 
156  /*!
157  \brief Merge segment 2 into segment 1.
158  \param segmentsIds Segments ids container.
159  \param merger The merger instance to use.
160  \param actSegsListHeadPtr A pointer the the active segments list head.
161  \param minMergesIterationThreshold Stop itarating when the number of merges drops below this value (Range 0-100);
162  \note Segment 1 merge iteration will not be updated
163  \note Segment 2 will be disabled at the end of merge process and all its neighbors pointers deleted.
164  */
165  template< typename FeatureDataTypeT >
169  SegmenterRegionGrowingMergeData const * const mergeDataPtr,
170  SegmentsIdsMatrixT& segmentsIds,
172  SegmenterRegionGrowingSegment< FeatureDataTypeT >** actSegsListHeadPtrPtr )
173  {
174  assert( segPtr1 );
175  assert( segPtr2 );
176  assert( actSegsListHeadPtrPtr );
177 
178  // features
179 
180  merger.mergeFeatures( segPtr1, segPtr2, mergeDataPtr );
181 
182  // updating the segments Ids container matrix
183 
184  const unsigned int& segmentsLineBound = segPtr2->m_yBound;
185  const unsigned int& segmentColStart = segPtr2->m_xStart;
186  const unsigned int& segmentColBound = segPtr2->m_xBound;
187  const SegmenterSegmentsBlock::SegmentIdDataType& segment1Id = segPtr1->m_id;
188  const SegmenterSegmentsBlock::SegmentIdDataType& segment2Id = segPtr2->m_id;
189  SegmenterSegmentsBlock::SegmentIdDataType* segmentsIdsLinePtr = 0;
190  unsigned int segmentCol = 0;
191 
192  for( unsigned int segmentsLine = segPtr2->m_yStart ;
193  segmentsLine < segmentsLineBound ; ++segmentsLine )
194  {
195  segmentsIdsLinePtr = segmentsIds[ segmentsLine ];
196 
197  for( segmentCol = segmentColStart ; segmentCol < segmentColBound ;
198  ++segmentCol )
199  {
200  if(
201  segmentsIdsLinePtr[ segmentCol ]
202  ==
203  segment2Id
204  )
205  {
206  segmentsIdsLinePtr[ segmentCol ] = segment1Id;
207  }
208  }
209  }
210 
211  // updating segment 1 basic attributes
212 
213  segPtr1->m_size += segPtr2->m_size;
214 
215  segPtr1->m_xStart = std::min(
216  segPtr1->m_xStart,
217  segPtr2->m_xStart );
218  segPtr1->m_xBound = std::max(
219  segPtr1->m_xBound,
220  segPtr2->m_xBound );
221 
222  segPtr1->m_yStart = std::min(
223  segPtr1->m_yStart,
224  segPtr2->m_yStart );
225  segPtr1->m_yBound = std::max(
226  segPtr1->m_yBound,
227  segPtr2->m_yBound );
228 
229  segPtr1->removeNeighborSegmentPtr( segPtr2 );
230 
231  // updating the segment 2 neighborhood segments
232  // with the current segment
233 
234  const unsigned int& neighborSegmentsSize = segPtr2->m_neighborSegmentsSize;
236 
237  for( unsigned int neighborSegIdx = 0 ; neighborSegIdx < neighborSegmentsSize;
238  ++neighborSegIdx )
239  {
240  neighborSegPtr = segPtr2->m_neighborSegments[ neighborSegIdx ];
241 
242  if(
243  (
244  neighborSegPtr != 0
245  )
246  &&
247  (
248  neighborSegPtr != segPtr1 )
249  )
250  {
251  // adding segment 2 neighborhood segments to the
252  // segment 1, if it is not already there
253 
254  segPtr1->addNeighborSegmentPtr( neighborSegPtr );
255 
256  // removing the merged segment reference from its neighbor
257  // list
258  neighborSegPtr->removeNeighborSegmentPtr( segPtr2 );
259 
260  // adding the segment 1 into segment 2 neighbor
261  // neighborhood segments list, if it is not already there
262 
263  neighborSegPtr->addNeighborSegmentPtr( segPtr1 );
264  }
265  }
266 
267  // disabling the merged segment
268  // The merged segment id will be given back to ids manager
269 
270  if( segPtr2 == (*actSegsListHeadPtrPtr) )
271  {
272  (*actSegsListHeadPtrPtr) = (*actSegsListHeadPtrPtr)->m_nextActiveSegment;
273 
274  if( (*actSegsListHeadPtrPtr) ) (*actSegsListHeadPtrPtr)->m_prevActiveSegment = 0;
275  }
276  else
277  {
278  if( segPtr2->m_prevActiveSegment )
279  {
280  segPtr2->m_prevActiveSegment->m_nextActiveSegment =
281  segPtr2->m_nextActiveSegment;
282  }
283 
284  if( segPtr2->m_nextActiveSegment )
285  {
286  segPtr2->m_nextActiveSegment->m_prevActiveSegment =
287  segPtr2->m_prevActiveSegment;
288  }
289  }
290 
291  segPtr2->disable();
292 
294  }
295 
296  /*!
297  \brief Merge too small segments to its closer neighbor.
298  \param maximumSegmentSize Only merge segments with sizes smaller than this value.
299  \param segmentsIds Segments ids container.
300  \param segmenterIdsManager A segments ids manager to acquire unique segments ids.
301  \param merger The merger instance to use.
302  \param globalMergeIterationsCounter A reference to a iteration number counter (this variable will be only incremented, never zeroed. It never must be reset. ).
303  \param actSegsListHeadPtr A pointer the the active segments list head.
304  */
305  template< typename FeatureDataTypeT >
306  void mergeTooSmallSegments( const unsigned int maximumSegmentSize,
307  SegmentsIdsMatrixT& segmentsIds,
308  SegmenterIdsManager& segmenterIdsManager,
310  IterationCounterType& globalMergeIterationsCounter,
311  SegmenterRegionGrowingSegment< FeatureDataTypeT >** actSegsListHeadPtrPtr )
312  {
313  TERP_TRUE_OR_THROW( actSegsListHeadPtrPtr != 0,
314  "Invalid active segments list header pointer" );
315 
316  if( (*actSegsListHeadPtrPtr) == 0 ) return;
317 
318  // Globals
319 
320  unsigned long int iterationMergedSegmentsNumber = 0;
321  SegmenterRegionGrowingSegment< FeatureDataTypeT >* minBackwardDissimilaritySegmentPtr = 0;
322  DissimilarityTypeT minBackwardDissimilarityValue = 0;
324  (*actSegsListHeadPtrPtr);
326 
327  // Merge data
328 
329  SegmenterRegionGrowingMergeData* backwardDissimilarityMergeDataPtr = 0;
330 
331  merger.createMergeData( &backwardDissimilarityMergeDataPtr );
332  std::unique_ptr< SegmenterRegionGrowingMergeData >
333  backwardDissimilarityAuxMergeDataPtr1(
334  backwardDissimilarityMergeDataPtr );
335 
336  merger.createMergeData( &backwardDissimilarityMergeDataPtr );
337  std::unique_ptr< SegmenterRegionGrowingMergeData >
338  backwardDissimilarityAuxMergeDataPtr2(
339  backwardDissimilarityMergeDataPtr );
340 
341  // Main iterations loop
342 
343  do
344  {
345  currActSegPtr = (*actSegsListHeadPtrPtr);
346 
347  // Updating the merger state
348  merger.update( *actSegsListHeadPtrPtr );
349 
350  iterationMergedSegmentsNumber = 0;
351 
352  // iterating over each segment
353  do
354  {
355  if( currActSegPtr->m_size < maximumSegmentSize )
356  {
357  // finding the neighbor segment with minimum dissimilary value
358  // related to the current segment
359 
360  findMinDissimilaryNeighbor( currActSegPtr,
361  merger,
362  backwardDissimilarityAuxMergeDataPtr1.get(),
363  backwardDissimilarityAuxMergeDataPtr2.get(),
364  &minBackwardDissimilaritySegmentPtr,
365  minBackwardDissimilarityValue,
366  &backwardDissimilarityMergeDataPtr );
367 
368  if( minBackwardDissimilaritySegmentPtr )
369  {
370  nextActSegPtr = currActSegPtr->m_nextActiveSegment;
371 
372  merge2Segments( minBackwardDissimilaritySegmentPtr, currActSegPtr,
373  backwardDissimilarityMergeDataPtr, segmentsIds,
374  merger, actSegsListHeadPtrPtr
375  );
376 
377  minBackwardDissimilaritySegmentPtr->m_mergetIteration = globalMergeIterationsCounter;
378 
379  currActSegPtr = nextActSegPtr;
380 
381  ++iterationMergedSegmentsNumber;
382  }
383  else
384  {
385  currActSegPtr = currActSegPtr->m_nextActiveSegment;
386  }
387  }
388  else
389  {
390  currActSegPtr = currActSegPtr->m_nextActiveSegment;
391  }
392  } while( currActSegPtr );
393 
394 // std::cout << std::endl << "Merging small segments -" <<
395 // " globalMergeIterationsCounter:" <<
396 // globalMergeIterationsCounter << " iterationMergedSegmentsNumber:"
397 // << iterationMergedSegmentsNumber << std::endl;
398 
399  ++globalMergeIterationsCounter;
400  } while( iterationMergedSegmentsNumber );
401  }
402 
403  /*!
404  \brief Merge segments following a maximum dissimilarity thresold.
405  \param disimilarityThreshold Maximum dissimilarity threshold.
406  \param enablelocalMutualBestFitting Enable/disable the use of mutual best fitting (two segments will be merged only if both have the mininum neighbor dissimilarity to each other).
407  \param segmentsIds Segments ids container.
408  \param segmenterIdsManager A segments ids manager to acquire unique segments ids.
409  \param merger The merger instance to use.
410  \param globalMergeIterationsCounter A reference to a iteration number counter (this variable will be only incremented, never zeroed. It never must be reset. ).
411  \param sameItMergesThreshold Min percentual difference from one iteration to the next (in terms of merges number) to execute one iteration where multiple merges are allowed for the same segment or to increase the Similarity Threshold(valid ranged: 0 -> 100).
412  \param segmentsSimIncreaseSteps The maximum number of steps to increment the disimilarity threshold value for the cases where no segment merge occurred - zero will disable segment similarity threshold increments.
413  \param actSegsListHeadPtrPtr A pointer the the active segments list head.
414  \param taskProgressPtr A pointer to a progress interface to check for user cancel or a null pointer (no pulse performed).
415  \return true if OK, false on errors
416  */
417  template< typename FeatureDataTypeT >
418  bool mergeSegments( const DissimilarityTypeT maxDisimilarityThreshold,
419  const bool enablelocalMutualBestFitting,
420  SegmentsIdsMatrixT& segmentsIds,
421  SegmenterIdsManager& segmenterIdsManager,
423  IterationCounterType& globalMergeIterationsCounter,
424  const double sameItMergesThreshold,
425  const unsigned int segmentsSimIncreaseSteps,
427  te::common::TaskProgress* taskProgressPtr )
428  {
429  TERP_TRUE_OR_THROW( actSegsListHeadPtrPtr != 0,
430  "Invalid active segments list header pointer" );
431 
432  if( (*actSegsListHeadPtrPtr) == 0 ) return true;
433 
434  // Globals
435 
436  const DissimilarityTypeT disimilarityThresholdStepValue =
437  segmentsSimIncreaseSteps ? maxDisimilarityThreshold / segmentsSimIncreaseSteps
438  : 0;
439 
440  unsigned long int maxAchievedMergesPerIteration = 0;
441  unsigned long int currentIterationMergedSegmentsNumber = 0;
443  (*actSegsListHeadPtrPtr);
445  bool enableSameIterationMerges = false;
446  DissimilarityTypeT currentDisimilarityThreshold =
447  segmentsSimIncreaseSteps ? 0 : maxDisimilarityThreshold;
448  IterationCounterType seqLowMergesItsNumber = 0;
449 
450  // forward variables
451 
452  SegmenterRegionGrowingSegment< FeatureDataTypeT >* minForwardDissimilaritySegmentPtr = 0;
453  DissimilarityTypeT minForwardDissimilarityValue = 0;
454  SegmenterRegionGrowingMergeData* minForwardDissimilarityMergeDataPtr = 0;
455 
456 
457  SegmenterRegionGrowingMergeData* forwardDissimilarityAuxMergeDataHandler1NPtr = 0;
458  merger.createMergeData( &forwardDissimilarityAuxMergeDataHandler1NPtr );
459  std::unique_ptr< SegmenterRegionGrowingMergeData >
460  forwardDissimilarityAuxMergeDataHandler1(
461  forwardDissimilarityAuxMergeDataHandler1NPtr );
462 
463  SegmenterRegionGrowingMergeData* forwardDissimilarityAuxMergeDataHandler2NPtr = 0;
464  merger.createMergeData( &forwardDissimilarityAuxMergeDataHandler2NPtr );
465  std::unique_ptr< SegmenterRegionGrowingMergeData >
466  forwardDissimilarityAuxMergeDataHandler2(
467  forwardDissimilarityAuxMergeDataHandler2NPtr );
468 
469  // backward variables
470 
471  SegmenterRegionGrowingSegment< FeatureDataTypeT >* minBackwardDissimilaritySegmentPtr = 0;
472  DissimilarityTypeT minBackwardDissimilarityValue = 0;
473 
474  SegmenterRegionGrowingMergeData* backwardDissimilarityMergeDataPtr = 0;
475 
476  merger.createMergeData( &backwardDissimilarityMergeDataPtr );
477  std::unique_ptr< SegmenterRegionGrowingMergeData >
478  backwardDissimilarityAuxMergeDataPtr1(
479  backwardDissimilarityMergeDataPtr );
480 
481  merger.createMergeData( &backwardDissimilarityMergeDataPtr );
482  std::unique_ptr< SegmenterRegionGrowingMergeData >
483  backwardDissimilarityAuxMergeDataPtr2(
484  backwardDissimilarityMergeDataPtr );
485 
486  // Main iterations loop
487 
488  do
489  {
490  currActSegPtr = (*actSegsListHeadPtrPtr);
491 
492  // Updating the merger state
493  merger.update( *actSegsListHeadPtrPtr );
494 
495  currentIterationMergedSegmentsNumber = 0;
496 
497  // iterating over each segment
498  do
499  {
500  nextActSegPtr = currActSegPtr->m_nextActiveSegment;
501 
502  if(
503  ( currActSegPtr->m_mergetIteration < globalMergeIterationsCounter )
504  ||
505  enableSameIterationMerges
506  )
507  {
508  currActSegPtr->m_mergetIteration = globalMergeIterationsCounter;
509 
510  // finding the neighbor segment with minimum dissimilary value
511  // related to the current segment
512 
513  findMinDissimilaryNeighbor( currActSegPtr,
514  merger,
515  forwardDissimilarityAuxMergeDataHandler1NPtr,
516  forwardDissimilarityAuxMergeDataHandler2NPtr,
517  &minForwardDissimilaritySegmentPtr,
518  minForwardDissimilarityValue,
519  &minForwardDissimilarityMergeDataPtr );
520 
521  // if the min forward dissimilarity segment was found
522  if(
523  ( minForwardDissimilaritySegmentPtr )
524  &&
525  ( minForwardDissimilarityValue <= currentDisimilarityThreshold )
526  &&
527  (
528  (
529  minForwardDissimilaritySegmentPtr->m_mergetIteration
530  <
531  globalMergeIterationsCounter
532  )
533  ||
534  enableSameIterationMerges
535  )
536  )
537  {
538  if( enablelocalMutualBestFitting )
539  {
540  findMinDissimilaryNeighbor( minForwardDissimilaritySegmentPtr,
541  merger,
542  backwardDissimilarityAuxMergeDataPtr1.get(),
543  backwardDissimilarityAuxMergeDataPtr2.get(),
544  &minBackwardDissimilaritySegmentPtr,
545  minBackwardDissimilarityValue,
546  &backwardDissimilarityMergeDataPtr );
547 
548  if( minBackwardDissimilaritySegmentPtr != currActSegPtr )
549  {
550  minForwardDissimilaritySegmentPtr = 0;
551  }
552  }
553 
554  if( minForwardDissimilaritySegmentPtr )
555  {
556  minForwardDissimilaritySegmentPtr->m_mergetIteration =
557  globalMergeIterationsCounter;
558 
559  if( currActSegPtr->m_size > minForwardDissimilaritySegmentPtr->m_size )
560  {
561  if( nextActSegPtr == minForwardDissimilaritySegmentPtr )
562  {
563  nextActSegPtr = minForwardDissimilaritySegmentPtr->m_nextActiveSegment;
564  }
565 
566  merge2Segments( currActSegPtr, minForwardDissimilaritySegmentPtr,
567  minForwardDissimilarityMergeDataPtr, segmentsIds,
568  merger, actSegsListHeadPtrPtr
569  );
570  }
571  else
572  {
573  merge2Segments( minForwardDissimilaritySegmentPtr, currActSegPtr,
574  minForwardDissimilarityMergeDataPtr, segmentsIds,
575  merger, actSegsListHeadPtrPtr
576  );
577  }
578 
579  ++currentIterationMergedSegmentsNumber;
580  }
581  }
582  }
583 
584  // going to the next segment
585  currActSegPtr = nextActSegPtr;
586 
587  } while( currActSegPtr );
588 
589  maxAchievedMergesPerIteration = std::max( currentIterationMergedSegmentsNumber,
590  maxAchievedMergesPerIteration );
591 
592 // std::cout << std::endl << "Merging segments -"
593 // << " maxAchievedMergesPerIteration:" << maxAchievedMergesPerIteration
594 // << " currentIterationMergedSegmentsNumber:" << currentIterationMergedSegmentsNumber
595 // << " currentDisimilarityThreshold:" << currentDisimilarityThreshold
596 // << " enableSameIterationMerges:" << enableSameIterationMerges
597 // << " globalMergeIterationsCounter:" << globalMergeIterationsCounter
598 // << " seqLowMergesItsNumber:" << seqLowMergesItsNumber
599 // << std::endl;
600 
601  if(
602  ((double)currentIterationMergedSegmentsNumber)
603  <
604  (
605  ((double)maxAchievedMergesPerIteration)
606  *
607  ( sameItMergesThreshold / 100.0 )
608  )
609  )
610  {
611  ++seqLowMergesItsNumber;
612  }
613  else
614  {
615  seqLowMergesItsNumber = 0;
616  }
617 
618  enableSameIterationMerges = false;
619 
620  if( currentIterationMergedSegmentsNumber == 0 )
621  {
622  if( currentDisimilarityThreshold == maxDisimilarityThreshold )
623  {
624  break;
625  }
626  else
627  {
628  currentDisimilarityThreshold = std::min( maxDisimilarityThreshold,
629  currentDisimilarityThreshold + disimilarityThresholdStepValue );
630 
631  maxAchievedMergesPerIteration = 0;
632  }
633  }
634  else if( seqLowMergesItsNumber > 3 )
635  {
636  seqLowMergesItsNumber = 0;
637  maxAchievedMergesPerIteration = 0;
638 
639  if( currentDisimilarityThreshold == maxDisimilarityThreshold )
640  {
641  enableSameIterationMerges = true;
642  }
643  else
644  {
645  currentDisimilarityThreshold = std::min( maxDisimilarityThreshold,
646  currentDisimilarityThreshold + disimilarityThresholdStepValue );
647  }
648  }
649 
650  ++globalMergeIterationsCounter;
651 
652  if(
653  taskProgressPtr
654  &&
655  ( ! taskProgressPtr->isActive() )
656  )
657  {
658  return false;
659  }
660 
661  } while( true );
662 
663  return true;
664  }
665 
666  } // end namespace rg
667  } // end namespace rp
668 } // end namespace te
669 
670 #endif // __TERRALIB_RP_INTERNAL_SEGMENTERREGIONGROWINGFUNCTIONS_H
te::rp::SegmenterRegionGrowingMerger::createMergeData
virtual void createMergeData(SegmenterRegionGrowingMergeData **mergeDataPtr) const =0
Create a new merge data instance when applicable.
te::rp::SegmenterRegionGrowingMerger
Abstract class for the segments merger.
Definition: SegmenterRegionGrowingMerger.h:53
te::rp::Matrix< SegmenterSegmentsBlock::SegmentIdDataType >
te
TerraLib.
Definition: AddressGeocodingOp.h:52
te::rp::SegmenterRegionGrowingSegment::m_size
unsigned int m_size
Segment area (pixels number).
Definition: SegmenterRegionGrowingSegment.h:61
te::rp::SegmenterRegionGrowingSegment::m_yBound
unsigned int m_yBound
Segment lower bound Y coordinate box over the label image.
Definition: SegmenterRegionGrowingSegment.h:81
te::rp::SegmenterRegionGrowingSegment::m_xBound
unsigned int m_xBound
Segment lower bound X coordinate box over the label image.
Definition: SegmenterRegionGrowingSegment.h:71
te::rp::rg::mergeSegments
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.
Definition: SegmenterRegionGrowingFunctions.h:418
SegmenterSegmentsBlock.h
Segments block.
te::rp::SegmenterRegionGrowingSegment::addNeighborSegmentPtr
void addNeighborSegmentPtr(SegmenterRegionGrowingSegment< FeatureDataTypeT > *const nSegPtr)
Add a pointer of a neighbor segment (if it is not already there).
Definition: SegmenterRegionGrowingSegment.h:195
te::rp::SegmenterRegionGrowingSegment::disable
void disable()
Disable this segment ( same as m_mergetIteration = std::numeric_limits< SegmenterRegionGrowingSegment...
Definition: SegmenterRegionGrowingSegment.h:143
te::rp::SegmenterRegionGrowingSegment::m_mergetIteration
IterationCounterType m_mergetIteration
The current merge iteration.
Definition: SegmenterRegionGrowingSegment.h:119
te::rp::SegmenterRegionGrowingSegment::m_xStart
unsigned int m_xStart
Segment left X coordinate box over the label image.
Definition: SegmenterRegionGrowingSegment.h:66
te::rp::rg::merge2Segments
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.
Definition: SegmenterRegionGrowingFunctions.h:166
Matrix.h
Generic template matrix.
SegmenterIdsManager.h
Segments IDs manager.
te::rp::SegmenterRegionGrowingSegment::m_yStart
unsigned int m_yStart
Segment upper Y coordinate box over the label image.
Definition: SegmenterRegionGrowingSegment.h:76
te::rp::SegmenterRegionGrowingMerger::update
virtual void update(SegmenterRegionGrowingSegment< FeatureDataTypeT > *const actSegsListHeadPtr)=0
Update the internal state.
te::rp::rg::BaatzFeatureType
float BaatzFeatureType
Baatz Strategy feature type.
Definition: SegmenterRegionGrowingFunctions.h:62
te::rp::SegmenterRegionGrowingSegment::m_neighborSegmentsSize
unsigned int m_neighborSegmentsSize
The current size of m_neighborSegments.
Definition: SegmenterRegionGrowingSegment.h:92
te::rp::SegmenterSegmentsBlock::SegmentIdDataType
unsigned int SegmentIdDataType
Definition: SegmenterSegmentsBlock.h:57
TERP_TRUE_OR_THROW
#define TERP_TRUE_OR_THROW(value, message)
Checks if value is true and throws an exception if not.
Definition: Macros.h:170
te::common::TaskProgress::isActive
bool isActive() const
Verify if the task is active.
te::rp::SegmenterRegionGrowingSegment::removeNeighborSegmentPtr
void removeNeighborSegmentPtr(SegmenterRegionGrowingSegment< FeatureDataTypeT > *const nSegPtr)
Remove all occurrences of a neighbor segment.
Definition: SegmenterRegionGrowingSegment.h:230
te::rp::rg::exportSegs2Tif
void exportSegs2Tif(const SegmentsIdsMatrixT &segmentsIds, bool normto8bits, const std::string &fileName)
Export the segments IDs to a tif file.
te::rp::rg::IterationCounterType
unsigned short int IterationCounterType
Iteration counter type.
Definition: SegmenterRegionGrowingFunctions.h:52
SegmenterRegionGrowingSegment.h
Region Growing segment.
te::rp::SegmenterRegionGrowingMerger::getDissimilarity
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.
te::rp::SegmenterRegionGrowingMerger::mergeFeatures
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.
te::rp::SegmenterRegionGrowingSegment::m_id
SegmenterSegmentsBlock::SegmentIdDataType m_id
Segment ID.
Definition: SegmenterRegionGrowingSegment.h:56
te::rp::rg::getActiveSegmentsNumber
unsigned long int getActiveSegmentsNumber(SegmenterRegionGrowingSegment< FeatureDataTypeT > *const actSegsListHeadPtr)
Returns the number of active segments.
Definition: SegmenterRegionGrowingFunctions.h:79
te::rp::DissimilarityTypeT
double DissimilarityTypeT
Type for dissimilarity.
Definition: SegmenterRegionGrowingMerger.h:46
te::rp::rg::SegmentsIdsMatrixT
Matrix< SegmenterSegmentsBlock::SegmentIdDataType > SegmentsIdsMatrixT
Definition for segments ids matrix type.
Definition: SegmenterRegionGrowingFunctions.h:47
te::rp::SegmenterRegionGrowingSegment::m_prevActiveSegment
SegmenterRegionGrowingSegment< FeatureDataTypeT > * m_prevActiveSegment
A pointer to the previous active segment.
Definition: SegmenterRegionGrowingSegment.h:97
te::rp::SegmenterRegionGrowingMergeData
Segmenter data used by the merger in region growing process.
Definition: SegmenterRegionGrowingMergeData.h:36
te::rp::SegmenterRegionGrowingSegment
Region Growing segment.
Definition: SegmenterRegionGrowingSegment.h:42
te::rp::SegmenterRegionGrowingSegment::removeAllNeighborSegmentsPtrs
void removeAllNeighborSegmentsPtrs()
Remove all neighbor segments.
Definition: SegmenterRegionGrowingSegment.h:272
te::rp::rg::findMinDissimilaryNeighbor
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.
Definition: SegmenterRegionGrowingFunctions.h:104
te::common::TaskProgress
This class can be used to inform the progress of a task.
Definition: TaskProgress.h:54
te::rp::rg::mergeTooSmallSegments
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.
Definition: SegmenterRegionGrowingFunctions.h:306
te::rp::SegmenterRegionGrowingSegment::m_neighborSegments
SegmenterRegionGrowingSegment< FeatureDataTypeT > ** m_neighborSegments
Neighborhood segments pointers (some pointers can be null) or a null pointer if there is no neighborh...
Definition: SegmenterRegionGrowingSegment.h:87
te::rp::SegmenterRegionGrowingSegment::m_nextActiveSegment
SegmenterRegionGrowingSegment< FeatureDataTypeT > * m_nextActiveSegment
A pointer to the next active segment.
Definition: SegmenterRegionGrowingSegment.h:102
te::rp::SegmenterIdsManager
Segmenter segments IDs manager.
Definition: SegmenterIdsManager.h:45
te::rp::rg::MeanFeatureType
float MeanFeatureType
Mean Strategy feature type.
Definition: SegmenterRegionGrowingFunctions.h:57
SegmenterRegionGrowingMerger.h
Segmenter merger used in region growing process.