Loading...
Searching...
No Matches
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"
33#include "../common/progress/TaskProgress.h"
34
35#include <cstring>
36
37namespace 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 >
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,
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,
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
#define TERP_TRUE_OR_THROW(value, message)
Checks if value is true and throws an exception if not.
Definition: Macros.h:170
Generic template matrix.
Segments IDs manager.
Segmenter merger used in region growing process.
Region Growing segment.
This class can be used to inform the progress of a task.
Definition: TaskProgress.h:54
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 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.
TerraLib.
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.