29 #include "../raster/Band.h"
30 #include "../raster/BandProperty.h"
31 #include "../raster/RasterFactory.h"
32 #include "../raster/Grid.h"
33 #include "../datatype/Enums.h"
34 #include "../common/StringUtils.h"
35 #include "../common/progress/TaskProgress.h"
41 #include <boost/lexical_cast.hpp>
46 segmenterRegionGrowingStrategyFactoryInstance;
82 throw( te::rp::Exception )
84 m_minSegmentSize = 100;
85 m_segmentsSimilarityThreshold = 0.1;
86 m_segmentFeatures = InvalidFeaturesType;
87 m_bandsWeights.clear();
89 m_compactnessWeight = 0.5;
90 m_segmentsSimIncreaseSteps = 10;
148 iterator segmentsIt = begin();
149 iterator segmentsItEnd = end();
151 while( segmentsIt != segmentsItEnd )
158 std::map< SegmenterSegmentsBlock::SegmentIdDataType, Segment* >::clear();
179 newInstancePtr->
copy(
this );
181 return newInstancePtr;
188 otherCastPtr =
dynamic_cast<
193 m_means = otherCastPtr->
m_means;
226 newInstancePtr->
copy(
this );
228 return newInstancePtr;
235 otherCastPtr =
dynamic_cast<
240 m_sums = otherCastPtr->
m_sums;
286 segment1Ptr ),
"Invalid segment type" );
291 segment2Ptr ),
"Invalid segment type" );
295 std::vector< double >::size_type meansSize =
301 double dissValue = 0.0;
302 double diffValue = 0.0;
304 for( std::vector< double >::size_type meansIdx = 0 ; meansIdx <
305 meansSize ; ++meansIdx )
310 dissValue += ( diffValue * diffValue );
313 return sqrt( dissValue );
318 Segment const *
const segment2Ptr,
322 segment1Ptr ),
"Invalid segment type" );
327 segment2Ptr ),
"Invalid segment type" );
351 const std::vector< double >::size_type meansSize =
357 for( std::vector< double >::size_type meansIdx = 0 ; meansIdx <
358 meansSize ; ++meansIdx )
388 const double& colorWeight,
const double& compactnessWeight,
389 const std::vector< double >& bandsWeights,
393 m_allSegsCompactnessOffset( 0 ),
394 m_allSegsCompactnessGain( 1.0 ),
395 m_allSegsSmoothnessOffset( 0 ),
396 m_allSegsSmoothnessGain( 0 ),
397 m_colorWeight( colorWeight ),
398 m_compactnessWeight( compactnessWeight ),
399 m_bandsWeights( bandsWeights ),
400 m_segmentsIds( segmentsIds ),
401 m_segments( segments )
417 segment1Ptr ),
"Invalid segment type" );
422 segment2Ptr ),
"Invalid segment type" );
427 mergedFeatures ),
"Invalid features type" );
446 mergedFeaturesCastPtr->
m_sums.resize( sumsSize );
448 mergedFeaturesCastPtr->
m_stdDev.resize( sumsSize );
456 const double sizeUnionD = (double)mergedFeaturesCastPtr->
m_size;
480 unsigned int touchingEdgeLength1 = 0;
481 unsigned int touchingEdgeLength2 = 0;
483 m_segmentsIds, mergedFeaturesCastPtr->
m_xStart,
490 touchingEdgeLength2 );
499 std::sqrt( sizeUnionD );
514 const double hCompact =
538 m_allSegsCompactnessOffset
541 m_allSegsCompactnessGain;
543 const double hSmooth =
567 m_allSegsSmoothnessOffset
570 m_allSegsSmoothnessGain;
581 ( 1.0 - m_compactnessWeight )
591 double squaresSumUnion = 0;
592 double meanUnion = 0;
593 double stdDevUnion = 0.0;
595 for(
unsigned int sumsIdx = 0 ; sumsIdx < sumsSize ; ++sumsIdx )
601 sumUnion = sum1 + sum2;
602 mergedFeaturesCastPtr->
m_sums[ sumsIdx ] = sumUnion;
606 mergedFeaturesCastPtr->
m_squaresSum[ sumsIdx ] = squaresSumUnion;
608 meanUnion = ( sum1 + sum2 ) / sizeUnionD;
616 2.0 * meanUnion * sumUnion
620 sizeUnionD * meanUnion * meanUnion
626 mergedFeaturesCastPtr->
m_stdDev[ sumsIdx ] = stdDevUnion;
630 m_bandsWeights[ sumsIdx ]
656 m_allSegsStdDevOffsets[ sumsIdx ]
659 m_allSegsStdDevGain[ sumsIdx ]
673 ( 1.0 - m_colorWeight )
686 segment1Ptr ),
"Invalid segment type" );
691 mergedFeatures ),
"Invalid features type" );
715 SegmenterRegionGrowingStrategy::SegmentsIndexer::const_iterator itB =
717 const SegmenterRegionGrowingStrategy::SegmentsIndexer::const_iterator itE =
719 std::vector< double >::size_type dimIdx = 0;
720 std::vector< double >::size_type dimsNumber = m_bandsWeights.size();
722 std::vector< double > stdDevMin( dimsNumber, DBL_MAX );
723 std::vector< double > stdDevMax( dimsNumber, -1.0 * DBL_MAX );
725 double compactnessMin = DBL_MAX;
726 double compactnessMax = -1.0 * DBL_MAX;
728 double smoothnessMin = DBL_MAX;
729 double smoothnessMax = -1.0 * DBL_MAX;
736 itB->second ),
"Invalid segment type" );
739 == dimsNumber,
"Invalid dims number" )
741 for( dimIdx = 0; dimIdx < dimsNumber ; ++dimIdx )
751 if( compactnessMax < segmentCastPtr->m_features.m_compactness )
756 if( smoothnessMax < segmentCastPtr->m_features.m_smoothness )
762 for( dimIdx = 0; dimIdx < dimsNumber ; ++dimIdx )
764 if( stdDevMax[ dimIdx ] == stdDevMin[ dimIdx ] )
766 m_allSegsStdDevOffsets[ dimIdx ] = 0.0;
768 if( stdDevMax[ dimIdx ] == 0.0 )
769 m_allSegsStdDevGain[ dimIdx ] = 1.0;
771 m_allSegsStdDevGain[ dimIdx ] = 1.0 / stdDevMax[ dimIdx ];
775 m_allSegsStdDevOffsets[ dimIdx ] = -1.0 * stdDevMin[ dimIdx ];
776 m_allSegsStdDevGain[ dimIdx ] = 1.0 /
777 ( stdDevMax[ dimIdx ] - stdDevMin[ dimIdx ] );
781 if( compactnessMax == compactnessMin )
783 m_allSegsCompactnessOffset = 0.0;
785 if( compactnessMax == 0.0 )
786 m_allSegsCompactnessGain = 1.0;
788 m_allSegsCompactnessGain = 1.0 / compactnessMax;
792 m_allSegsCompactnessOffset = -1.0 * compactnessMin;
793 m_allSegsCompactnessGain = 1.0 / ( compactnessMax - compactnessMin );
796 if( smoothnessMax == smoothnessMin )
798 m_allSegsSmoothnessOffset = 0.0;
800 if( smoothnessMax == 0.0 )
801 m_allSegsSmoothnessGain = 1.0;
803 m_allSegsSmoothnessGain = 1.0 / smoothnessMax;
807 m_allSegsSmoothnessOffset = -1.0 * smoothnessMin;
808 m_allSegsSmoothnessGain = 1.0 / ( smoothnessMax - smoothnessMin );
826 throw( te::rp::Exception )
839 "Invalid segmenter strategy parameter m_minSegmentSize" )
843 "Invalid segmenter strategy parameter m_segmentsSimilarityThreshold" )
847 "Invalid segmenter strategy parameter m_segmentFeatures" )
852 "Invalid segmenter strategy parameter m_bandsWeights" );
853 double bandsWeightsSum = 0;
854 for(
unsigned int bandsWeightsIdx = 0 ; bandsWeightsIdx <
860 "Invalid segmenter strategy parameter m_bandsWeights" );
884 const std::vector< unsigned int >& inputRasterBands,
885 const std::vector< double >& inputRasterGains,
886 const std::vector< double >& inputRasterOffsets,
888 const unsigned int outputRasterBand,
889 const bool enableProgressInterface )
890 throw( te::rp::Exception )
893 "Instance not initialized" )
899 ((double)inputRasterBands.size()) );
905 inputRaster, inputRasterBands, inputRasterGains,
906 inputRasterOffsets, segmentsIndexer ),
907 "Segments initalization error" );
911 std::auto_ptr< Merger > mergerPtr;
912 bool enablelocalMutualBestFitting =
false;
919 enablelocalMutualBestFitting =
true;
927 enablelocalMutualBestFitting =
true;
939 std::auto_ptr< te::common::TaskProgress > progressPtr;
940 if( enableProgressInterface )
943 progressPtr->setTotalSteps( 100 );
944 progressPtr->setMessage(
"Segmentation" );
951 unsigned int mergedSegments = 0;
952 unsigned int maxMergedSegments = 0;
953 unsigned int noMergeIterations = 0;
961 mergedSegments =
mergeSegments( similarityThreshold, segmenterIdsManager,
962 *mergerPtr, enablelocalMutualBestFitting, segmentsIndexer );
966 if( enableProgressInterface )
968 if( maxMergedSegments )
974 ( (
double)( maxMergedSegments - mergedSegments ) )
976 ((
double)maxMergedSegments )
983 if( currStep > progressPtr->getCurrentStep() )
985 progressPtr->setCurrentStep( currStep );
989 if( ! progressPtr->isActive() )
994 if( maxMergedSegments < mergedSegments )
996 maxMergedSegments = mergedSegments;
1000 if( mergedSegments == 0 )
1002 ++noMergeIterations;
1010 similarityThreshold +=
1020 if( enableProgressInterface )
1022 progressPtr->setCurrentStep( 50 );
1023 if( ! progressPtr->isActive() )
1031 maxMergedSegments = 0;
1036 segmenterIdsManager, *mergerPtr, segmentsIndexer );
1040 if( enableProgressInterface )
1042 if( maxMergedSegments )
1044 currStep = 50 + (int)
1048 ( (
double)( maxMergedSegments - mergedSegments ) )
1050 ((
double)maxMergedSegments )
1057 if( currStep > progressPtr->getCurrentStep() )
1059 progressPtr->setCurrentStep( currStep );
1063 if( ! progressPtr->isActive() )
1068 if( maxMergedSegments < mergedSegments )
1070 maxMergedSegments = mergedSegments;
1074 if( mergedSegments == 0 )
1081 if( enableProgressInterface )
1083 progressPtr->setCurrentStep( 100 );
1084 if( ! progressPtr->isActive() )
1093 const unsigned int nLines = inputRaster.getNumberOfRows();
1094 const unsigned int nCols = inputRaster.getNumberOfColumns();
1095 unsigned int col = 0;
1098 for(
unsigned int line = 0 ; line < nLines ; ++line )
1102 for( col = 0 ; col < nCols ; ++col )
1104 outputRaster.setValue( col, line, segmentsIdsLinePtr[ col ], outputRasterBand );
1113 const unsigned int bandsToProcess,
1114 const unsigned int pixelsNumber )
const
1146 if( bandsToProcess == 3 )
1152 double dM = ( maxM - minM );
1153 double slope = dM / ( 3.0 - ((double)bandsToProcess) );
1156 ( ((
double)bandsToProcess) * slope ) + minM
1160 ((
double)pixelsNumber) / 45968256.0
1178 const std::vector< unsigned int >& inputRasterBands,
1179 const std::vector< double >& inputRasterGains,
1180 const std::vector< double >& inputRasterOffsets,
1183 segsIndexer.
clear();
1187 const unsigned int inputRasterBandsSize = (
unsigned int)
1188 inputRasterBands.size();
1197 "Error allocating segments Ids matrix" );
1202 std::vector< double > bandDummyValues;
1205 for(
unsigned int inputRasterBandsIdx = 0 ; inputRasterBandsIdx <
1206 inputRasterBandsSize ; ++inputRasterBandsIdx )
1208 bandDummyValues.push_back( inputRaster.
getBand(
1215 unsigned int line = 0;
1216 unsigned int col = 0;
1218 Segment* neighborSegmentPtr = 0;
1220 bool rasterValuesAreValid =
true;
1221 unsigned int inputRasterBandsIdx = 0;
1223 const std::vector< double > dummyZeroesVector( inputRasterBandsSize, 0 );
1225 std::list< SegmenterSegmentsBlock::SegmentIdDataType >
1226 unusedLineSegmentIds;
1228 std::vector< SegmenterSegmentsBlock::SegmentIdDataType >
1230 lineSegmentIds.reserve( nCols );
1232 std::vector< double > rasterValues;
1233 std::vector< double > rasterSquareValues;
1234 rasterValues.resize( inputRasterBandsSize, 0 );
1235 rasterSquareValues.resize( inputRasterBandsSize, 0 );
1237 for( line = 0 ; line < nLines ; ++line )
1239 segmenterIdsManager.
getNewIDs( nCols, lineSegmentIds );
1241 for( col = 0 ; col < nCols ; ++col )
1243 rasterValuesAreValid =
true;
1245 for( inputRasterBandsIdx = 0 ; inputRasterBandsIdx <
1246 inputRasterBandsSize ; ++inputRasterBandsIdx )
1248 inputRaster.
getValue( col, line, value,
1249 inputRasterBands[ inputRasterBandsIdx ] );
1251 if( value == bandDummyValues[ inputRasterBandsIdx ] )
1253 rasterValuesAreValid =
false;
1258 value += inputRasterOffsets[ inputRasterBandsIdx ];
1259 value *= inputRasterGains[ inputRasterBandsIdx ];
1261 rasterValues[ inputRasterBandsIdx ] = value;
1262 rasterSquareValues[ inputRasterBandsIdx ] = value * value;
1268 if( rasterValuesAreValid )
1276 if( segmentPtr == 0 )
1288 if( segmentPtr == 0 )
1326 if( neighborSegmentId )
1328 neighborSegmentPtr = segsIndexer[ neighborSegmentId ];
1330 "Invalid neighboorSegmentPtr" );
1342 if( neighborSegmentId )
1344 neighborSegmentPtr = segsIndexer[ neighborSegmentId ];
1346 "Invalid neighboorSegmentPtr" );
1357 unusedLineSegmentIds.push_back( lineSegmentIds[ col ] );
1363 if( ! unusedLineSegmentIds.empty() )
1365 segmenterIdsManager.
addFreeIDs( unusedLineSegmentIds );
1366 unusedLineSegmentIds.clear();
1374 const double similarityThreshold,
1377 const bool enablelocalMutualBestFitting,
1380 unsigned int mergedSegmentsNumber = 0;
1382 std::list< Segment* >::iterator nSegsIt;
1383 std::list< Segment* >::iterator nSegsItEnd;
1385 std::list< Segment* >::iterator nSegNSegsIt;
1386 std::list< Segment* >::iterator nSegNSegsItEnd;
1388 std::list< Segment* >::iterator minForwardDissimilaritySegmentIt;
1389 double minForwardDissimilarityValue = 0;
1391 minForwardDissimilaritySegmentId = 0;
1393 std::list< Segment* >::iterator minBackwardDissimilaritySegmentIt;
1395 double minBackwardDissimilarityValue = 0;
1397 double forwardDissimilarityValue = 0;
1398 double backwardDissimilarityValue = 0;
1400 unsigned int segmentsLine = 0;
1401 unsigned int segmentsLineBound = 0;
1402 unsigned int segmentCol = 0;
1403 unsigned int segmentColStart = 0;
1404 unsigned int segmentColBound = 0;
1410 std::list< SegmenterSegmentsBlock::SegmentIdDataType > freeSegmentIds;
1414 std::auto_ptr< SegmentFeatures > auxSegFeatures1;
1415 std::auto_ptr< SegmentFeatures > auxSegFeatures2;
1416 std::auto_ptr< SegmentFeatures > minForwardDissimilaritySegmentFeatures;
1417 if( ! segsIndexer.empty() )
1419 auxSegFeatures1.reset(
1420 segsIndexer.begin()->second->getFeatures()->clone() );
1421 auxSegFeatures2.reset(
1422 segsIndexer.begin()->second->getFeatures()->clone() );
1423 minForwardDissimilaritySegmentFeatures.reset(
1424 segsIndexer.begin()->second->getFeatures()->clone() );
1433 SegmentsIndexer::iterator segsIt = segsIndexer.begin();
1435 while( segsIt != segsIndexer.end() )
1440 nSegsIt = segsIt->second->m_neighborSegments.begin();
1441 nSegsItEnd = segsIt->second->m_neighborSegments.end();
1443 minForwardDissimilaritySegmentIt = nSegsItEnd;
1444 minForwardDissimilarityValue = DBL_MAX;
1446 while( nSegsIt != nSegsItEnd )
1449 *nSegsIt, auxSegFeatures1.get() );
1451 if( ( forwardDissimilarityValue < similarityThreshold ) &&
1452 ( forwardDissimilarityValue < minForwardDissimilarityValue ) )
1454 minForwardDissimilarityValue = forwardDissimilarityValue;
1455 minForwardDissimilaritySegmentIt = nSegsIt;
1456 minForwardDissimilaritySegmentId =
1457 (*minForwardDissimilaritySegmentIt)->getFeatures()->m_id;
1458 minForwardDissimilaritySegmentFeatures->copy( auxSegFeatures1.get() );
1466 if( enablelocalMutualBestFitting &&
1467 (minForwardDissimilaritySegmentIt != nSegsItEnd ) )
1471 minBackwardDissimilaritySegmentIt =
1472 (*minForwardDissimilaritySegmentIt)->m_neighborSegments.end();
1473 minBackwardDissimilarityValue = DBL_MAX;
1476 (*minForwardDissimilaritySegmentIt)->m_neighborSegments.begin();
1478 (*minForwardDissimilaritySegmentIt)->m_neighborSegments.end();
1480 while( nSegNSegsIt != nSegNSegsItEnd )
1482 backwardDissimilarityValue =
1484 *nSegNSegsIt, auxSegFeatures2.get() );
1486 if( backwardDissimilarityValue < minBackwardDissimilarityValue )
1488 minBackwardDissimilarityValue = backwardDissimilarityValue;
1489 minBackwardDissimilaritySegmentIt = nSegNSegsIt;
1497 minBackwardDissimilaritySegmentIt
1499 (*minForwardDissimilaritySegmentIt)->m_neighborSegments.end()
1503 ( *minBackwardDissimilaritySegmentIt )
1509 minForwardDissimilaritySegmentIt = nSegsItEnd;
1515 if( minForwardDissimilaritySegmentIt != nSegsItEnd )
1519 merger.
mergeFeatures( segsIt->second, *minForwardDissimilaritySegmentIt,
1520 minForwardDissimilaritySegmentFeatures.get() );
1526 (*minForwardDissimilaritySegmentIt)->m_neighborSegments.begin();
1528 (*minForwardDissimilaritySegmentIt)->m_neighborSegments.end();
1530 while( nSegNSegsIt != nSegNSegsItEnd )
1532 if( (*nSegNSegsIt) != segsIt->second )
1537 if( std::find( segsIt->second->m_neighborSegments.begin(),
1538 segsIt->second->m_neighborSegments.end(), (*nSegNSegsIt) ) ==
1539 segsIt->second->m_neighborSegments.end() )
1541 segsIt->second->m_neighborSegments.push_back( *nSegNSegsIt );
1547 if( std::find( (*nSegNSegsIt)->m_neighborSegments.begin(),
1548 (*nSegNSegsIt)->m_neighborSegments.end(), segsIt->second ) ==
1549 (*nSegNSegsIt)->m_neighborSegments.end() )
1551 (*nSegNSegsIt)->m_neighborSegments.push_back( segsIt->second );
1557 (*nSegNSegsIt)->m_neighborSegments.remove(
1558 *minForwardDissimilaritySegmentIt );
1566 segmentsLineBound = (*minForwardDissimilaritySegmentIt)->getFeatures()->m_yBound;
1567 segmentColStart = (*minForwardDissimilaritySegmentIt)->getFeatures()->m_xStart;
1568 segmentColBound = (*minForwardDissimilaritySegmentIt)->getFeatures()->m_xBound;
1569 currentSegmentId = segsIt->second->getFeatures()->m_id;
1571 for( segmentsLine = (*minForwardDissimilaritySegmentIt)->getFeatures()->m_yStart ;
1572 segmentsLine < segmentsLineBound ; ++segmentsLine )
1576 for( segmentCol = segmentColStart ; segmentCol <
1577 segmentColBound ; ++segmentCol )
1579 if( segmentsIdsLinePtr[ segmentCol ] ==
1580 minForwardDissimilaritySegmentId )
1582 segmentsIdsLinePtr[ segmentCol ] = currentSegmentId;
1594 segsIt->second->m_neighborSegments.erase(
1595 minForwardDissimilaritySegmentIt );
1597 segsIndexer.erase( minForwardDissimilaritySegmentId );
1599 freeSegmentIds.push_back( minForwardDissimilaritySegmentId );
1601 ++mergedSegmentsNumber;
1609 if( ! freeSegmentIds.empty() )
1611 segmenterIdsManager.
addFreeIDs( freeSegmentIds );
1614 return mergedSegmentsNumber;
1618 const unsigned int minSegmentSize,
1623 unsigned int mergedSegmentsNumber = 0;
1625 std::list< Segment* >::iterator nSegsIt;
1626 std::list< Segment* >::iterator nSegsItEnd;
1628 std::list< Segment* >::iterator nSegNSegsIt;
1629 std::list< Segment* >::iterator nSegNSegsItEnd;
1631 std::list< Segment* >::iterator minForwardDissimilaritySegmentIt;
1632 double minForwardDissimilarityValue = 0;
1634 minForwardDissimilaritySegmentId = 0;
1636 double forwardDissimilarityValue = 0;
1638 unsigned int segmentsLine = 0;
1639 unsigned int segmentsLineBound = 0;
1640 unsigned int segmentCol = 0;
1641 unsigned int segmentColStart = 0;
1642 unsigned int segmentColBound = 0;
1650 std::auto_ptr< SegmentFeatures > candidateAuxSegFeatures;
1651 std::auto_ptr< SegmentFeatures > minForwardDissimilarityFeatures;
1652 if( ! segsIndexer.empty() )
1654 candidateAuxSegFeatures.reset(
1655 segsIndexer.begin()->second->getFeatures()->clone() );
1656 minForwardDissimilarityFeatures.reset(
1657 candidateAuxSegFeatures->clone() );
1666 SegmentsIndexer::iterator segsIt = segsIndexer.begin();
1668 while( segsIt != segsIndexer.end() )
1672 if( segsIt->second->getFeatures()->m_size < minSegmentSize )
1676 nSegsIt = segsIt->second->m_neighborSegments.begin();
1677 nSegsItEnd = segsIt->second->m_neighborSegments.end();
1679 minForwardDissimilaritySegmentIt = nSegsItEnd;
1680 minForwardDissimilarityValue = DBL_MAX;
1682 while( nSegsIt != nSegsItEnd )
1685 *nSegsIt, candidateAuxSegFeatures.get() );
1687 if( forwardDissimilarityValue < minForwardDissimilarityValue )
1689 minForwardDissimilarityValue = forwardDissimilarityValue;
1690 minForwardDissimilaritySegmentIt = nSegsIt;
1691 minForwardDissimilaritySegmentId =
1692 (*minForwardDissimilaritySegmentIt)->getFeatures()->m_id;
1693 minForwardDissimilarityFeatures->copy( candidateAuxSegFeatures.get() );
1701 if( minForwardDissimilaritySegmentIt != nSegsItEnd )
1707 segsIt->second, minForwardDissimilarityFeatures.get() );
1713 segsIt->second->m_neighborSegments.begin();
1715 segsIt->second->m_neighborSegments.end();
1717 while( nSegNSegsIt != nSegNSegsItEnd )
1719 if( (*nSegNSegsIt) != (*minForwardDissimilaritySegmentIt) )
1725 (*minForwardDissimilaritySegmentIt)->m_neighborSegments.begin(),
1726 (*minForwardDissimilaritySegmentIt)->m_neighborSegments.end(),
1728 (*minForwardDissimilaritySegmentIt)->m_neighborSegments.end() )
1730 (*minForwardDissimilaritySegmentIt)->m_neighborSegments.push_back(
1737 if( std::find( (*nSegNSegsIt)->m_neighborSegments.begin(),
1738 (*nSegNSegsIt)->m_neighborSegments.end(),
1739 (*minForwardDissimilaritySegmentIt) ) ==
1740 (*nSegNSegsIt)->m_neighborSegments.end() )
1742 (*nSegNSegsIt)->m_neighborSegments.push_back(
1743 *minForwardDissimilaritySegmentIt );
1749 (*nSegNSegsIt)->m_neighborSegments.remove( segsIt->second );
1757 segmentsLineBound = segsIt->second->getFeatures()->m_yBound;
1758 segmentColStart = segsIt->second->getFeatures()->m_xStart;
1759 segmentColBound = segsIt->second->getFeatures()->m_xBound;
1760 currentSegmentId = segsIt->second->getFeatures()->m_id;
1762 for( segmentsLine = segsIt->second->getFeatures()->m_yStart ;
1763 segmentsLine < segmentsLineBound ; ++segmentsLine )
1767 for( segmentCol = segmentColStart ; segmentCol <
1768 segmentColBound ; ++segmentCol )
1770 if( segmentsIdsLinePtr[ segmentCol ] ==
1773 segmentsIdsLinePtr[ segmentCol ] =
1774 minForwardDissimilaritySegmentId;
1784 (*minForwardDissimilaritySegmentIt)->m_neighborSegments.remove(
1791 segsIndexer.erase( currentSegmentId );
1793 segmenterIdsManager.
addFreeID( currentSegmentId );
1795 ++mergedSegmentsNumber;
1808 return mergedSegmentsNumber;
1813 const std::string& fileName )
1815 std::map<std::string, std::string> rinfo;
1816 rinfo[
"SOURCE"] = fileName;
1823 std::vector< te::rst::BandProperty* > bandsProps;
1828 gridPtr, bandsProps, rinfo );
1831 unsigned int col = 0;
1832 unsigned int line = 0 ;
1834 double offset = 0.0;
1839 double minValue = DBL_MAX;
1840 double maxValue = -1.0 * DBL_MAX;
1843 for( line = 0 ; line < linesNmb ; ++line )
1845 for( col = 0 ; col < colsNmb ; ++col )
1847 value = (double)segmentsIds( line, col );
1849 if( value > maxValue ) maxValue = value;
1850 if( value < minValue ) minValue = value;
1855 scale = 254.0 / ( maxValue - minValue );
1860 for( line = 0 ; line < linesNmb ; ++line )
1862 for( col = 0 ; col < colsNmb ; ++col )
1864 value = ( ((double)segmentsIds( line, col )) - offset ) * scale;
1866 boost::lexical_cast< std::string >( value ) )
1868 rasterPtr->
setValue( col, line, value , 0 );
1877 const unsigned int& xStart,
const unsigned int& yStart,
1878 const unsigned int& xBound,
const unsigned int& yBound,
1881 unsigned int& edgeLength1,
1882 unsigned int& edgeLength2 )
1903 unsigned int xIdx = 0;
1904 const unsigned int lastColIdx = colsNumber - 1;
1905 const unsigned int lastLineIdx = linesNumber - 1;
1907 for(
unsigned int yIdx = yStart ; yIdx < yBound ; ++yIdx )
1909 for( xIdx = xStart; xIdx < xBound ; ++xIdx )
1911 if( segsIds[ yIdx ][ xIdx ] == id1 )
1914 if( segsIds[ yIdx - 1 ][ xIdx ] == id2 )
1920 if( segsIds[ yIdx ][ xIdx - 1 ] == id2 )
1925 if( yIdx < lastLineIdx)
1926 if( segsIds[ yIdx + 1 ][ xIdx ] == id2 )
1931 if( xIdx < lastColIdx )
1932 if( segsIds[ yIdx ][ xIdx + 1 ] == id2 )
1938 else if( segsIds[ yIdx ][ xIdx ] == id2 )
1941 if( segsIds[ yIdx - 1 ][ xIdx ] == id1 )
1947 if( segsIds[ yIdx ][ xIdx - 1 ] == id1 )
1952 if( yIdx < lastLineIdx)
1953 if( segsIds[ yIdx + 1 ][ xIdx ] == id1 )
1958 if( xIdx < lastColIdx )
1959 if( segsIds[ yIdx ][ xIdx + 1 ] == id1 )
#define TERP_DEBUG_TRUE_OR_THROW(value, message)
Checks if value is true and throws an exception if not.
void update()
Update the internal state.
std::vector< double > m_allSegsStdDevGain
The gains applied to normalize the standard deviation value.
virtual void mergeFeatures(SegmenterRegionGrowingStrategy::Segment *const segment1Ptr, Segment const *const segment2Ptr, SegmenterRegionGrowingStrategy::SegmentFeatures const *const mergedFeatures) const =0
Merge specific segment features from both segments into the first segment.
Raster region growing segmenter strategy.
Baatz based segment features.
BaatzMerger(const double &colorWeight, const double &compactnessWeight, const std::vector< double > &bandsWeights, const SegmentsIdsMatrixT &segmentsIds, const SegmenterRegionGrowingStrategy::SegmentsIndexer &segments)
Default constructor.
virtual void setValue(unsigned int c, unsigned int r, const double value, std::size_t b=0)
Sets the attribute value in a band of a cell.
unsigned int getNumberOfRows() const
Returns the raster number of rows.
Raster region growing segmenter strategy.
A segment based on Baatz features values.
virtual ~SegmentFeatures()
unsigned int m_xBound
Segment lower bound X coordinate box over the label image.
Segmenter segments block description class.
A segment based on pixel mean values.
double getMemUsageEstimation(const unsigned int bandsToProcess, const unsigned int pixelsNumber) const
Returns a memory estimation (bytes).
te::rp::SegmenterStrategy * build()
Concrete factories (derived from this one) must implement this method in order to create objects...
SegmentsIndexer(SegmenterSegmentsPool &segmentsPool)
unsigned int SegmentIdDataType
static Raster * make()
It creates and returns an empty raster with default raster driver.
unsigned int getLinesNumber() const
The number of current matrix lines.
SegmenterRegionGrowingStrategy()
void store(SegmenterSegment *segPtr)
Store a new segment.
double m_compactnessWeight
The weight given to the compactness component, deafult:0.5, valid range: [0,1].
SegmenterSegmentsBlock::SegmentIdDataType m_id
Segment ID.
void addFreeID(const SegmenterSegmentsBlock::SegmentIdDataType &id)
Stores a free unique ID for later use.
std::vector< double > m_squaresSum
The sum of squares of pixel values (for each band).
void copy(SegmenterRegionGrowingStrategy::SegmentFeatures const *const otherPtr)
Copy the other instance state into this one.
virtual void getValue(unsigned int c, unsigned int r, double &value, std::size_t b=0) const
Returns the attribute value of a band of a cell.
double m_colorWeight
The weight given to the color component, deafult:0.5, valid range: [0,1].
MeanBasedSegment::SegmentFeatures m_features
std::vector< double > m_allSegsStdDevOffsets
The offsets applied to normalize the standard deviation value.
SegmenterSegmentsPool m_segmentsPool
A pool of segments that can be reused on each strategy execution.
std::list< Segment * > m_neighborSegments
Neighborhood segments.
unsigned int m_yStart
Segment upper Y coordinate box over the label image.
Internal segments indexer.
#define TERP_TRUE_OR_RETURN_FALSE(value, message)
Checks if value is true. For false values a warning message will be logged and a return of context wi...
void copy(SegmenterRegionGrowingStrategy::SegmentFeatures const *const otherPtr)
Copy the other instance state into this one.
double m_smoothness
Smoothness of the current segment.
Abstract parameters base interface.
void mergeFeatures(SegmenterRegionGrowingStrategy::Segment *const segmen1tPtr, Segment const *const segmen2tPtr, SegmenterRegionGrowingStrategy::SegmentFeatures const *const mergedFeatures) const
Merge specific segment features from both segments into the first segment.
A rectified grid is the spatial support for raster data.
bool initialize(SegmenterStrategyParameters const *const strategyParams)
Initialize the segmentation strategy.
Mean based segment features.
void reset()
Clear all internal allocated resources and reset the parameters instance to its initial state...
virtual SegmenterRegionGrowingStrategy::SegmentFeatures * getFeatures()=0
Returns the current segment internal features.
Segmenter segments IDs manager.
unsigned int m_segmentsSimIncreaseSteps
The maximum number of steps to increment the similarity threshold value for the cases where no segmen...
void addFreeIDs(const std::vector< SegmenterSegmentsBlock::SegmentIdDataType > &ids)
Stores free unique IDs for later use.
virtual void update()=0
Update the internal state.
unsigned int mergeSegments(const double similarityThreshold, SegmenterIdsManager &segmenterIdsManager, Merger &merger, const bool enablelocalMutualBestFitting, SegmentsIndexer &segsIndexer)
Merge closest segments.
SegmenterRegionGrowingStrategyFactory()
unsigned int mergeSmallSegments(const unsigned int minSegmentSize, SegmenterIdsManager &segmenterIdsManager, Merger &merger, SegmentsIndexer &segsIndexer)
Merge only small segments to their closest segment.
The Baatz based features will be used - Reference: Baatz, M.; Schape, A. Multiresolution segmentation...
bool m_isInitialized
true if this instance is initialized.
unsigned int m_size
Segment area (pixels number).
SegmenterRegionGrowingStrategy::SegmentFeatures * clone() const
Creat a clone of this object.
Segmenter Strategy Parameters.
Raster segmenter strategy base class.
unsigned int getNumberOfColumns() const
Returns the raster number of columns.
double m_compactness
Compactness of the current segment.
bool initializeSegments(SegmenterIdsManager &segmenterIdsManager, const te::rst::Raster &inputRaster, const std::vector< unsigned int > &inputRasterBands, const std::vector< double > &inputRasterGains, const std::vector< double > &inputRasterOffsets, SegmentsIndexer &segments)
Initialize the segment objects container and the segment IDs container.
std::vector< double > m_stdDev
Standard deviation of segment pixel velues.
AbstractParameters * clone() const
Create a clone copy of this instance.
std::vector< double > m_bandsWeights
The weight given to each band, when applicable (note: the bands weights sum must always be 1) or an e...
unsigned int m_minSegmentSize
A positive minimum segment size (pixels number - default: 100).
bool getNewIDs(const unsigned int &idsNumber, std::vector< SegmenterSegmentsBlock::SegmentIdDataType > &ids)
Returns new segment unique IDs.
SegmentFeaturesType m_segmentFeatures
What segment features will be used on the segmentation process (default:InvalidFeaturesType).
const SegmenterRegionGrowingStrategy::SegmentFeatures & operator=(const SegmenterRegionGrowingStrategy::SegmentFeatures &other)
static void getTouchingEdgeLength(const SegmentsIdsMatrixT &segsIds, const unsigned int &xStart, const unsigned int &yStart, const unsigned int &xBound, const unsigned int &yBound, const SegmenterSegmentsBlock::SegmentIdDataType &id1, const SegmenterSegmentsBlock::SegmentIdDataType &id2, unsigned int &edgeLength1, unsigned int &edgeLength2)
Returns the count of points from region 1 (with ID1) touching the region 2 (with ID2).
SegmentsIdsMatrixT m_segmentsIdsMatrix
A internal segments IDs matrix that can be reused on each strategy execution.
A raster band description.
double m_noDataValue
Value to indicate elements where there is no data, default is std::numeric_limits<double>::max().
void clear()
Clear all stored segments.
double getDissimilarityIndex(SegmenterRegionGrowingStrategy::Segment const *const segmen1tPtr, SegmenterRegionGrowingStrategy::Segment const *const segmen2tPtr, SegmenterRegionGrowingStrategy::SegmentFeatures *mergedFeatures) const
Returns a dissimilarity index between this and the other segment (normalized between 0 and 1)...
double m_segmentsSimilarityThreshold
Segments similarity treshold - Segments with similarity values below this value will be merged; valid...
#define TERP_TRUE_OR_THROW(value, message)
Checks if value is true and throws an exception if not.
double getDissimilarityIndex(SegmenterRegionGrowingStrategy::Segment const *const segmen1tPtr, SegmenterRegionGrowingStrategy::Segment const *const segmen2tPtr, SegmenterRegionGrowingStrategy::SegmentFeatures *mergedFeatures) const
Returns a dissimilarity index between this and the other segment (normalized between 0 and 1)...
unsigned int getColumnsNumber() const
The number of current matrix columns.
Segment features base class.
~SegmenterRegionGrowingStrategyFactory()
~SegmenterRegionGrowingStrategy()
SegmenterSegment * retrive()
Retrive a stored segment.
void reset()
Reset (clear) the active instance data.
An abstract class for raster data strucutures.
BandProperty * getProperty()
Returns the band property.
virtual const Band * getBand(std::size_t i) const =0
Returns the raster i-th band.
This class can be used to inform the progress of a task.
#define TERP_LOG_AND_THROW(message)
Logs a error message and throws.
void mergeFeatures(SegmenterRegionGrowingStrategy::Segment *const segmen1tPtr, Segment const *const segmen2tPtr, SegmenterRegionGrowingStrategy::SegmentFeatures const *const mergedFeatures) const
Merge specific segment features from both segments into the first segment.
Raster segmenter strategy factory base class.
The mean of segments pixel values will be used - Reference: S. A. Bins, L. M. G. Fonseca, G. J. Erthal e F. M. Ii, "Satellite Imagery segmentation: a region growing approach", VIII Simposio Brasileiro de Sensoriamento Remoto, Salvador, BA, 14-19 abril 1996.
std::vector< double > m_means
Segment mean values (for each band), normalized between 0 and 1.
SegmenterRegionGrowingStrategy::Parameters m_parameters
Internal execution parameters.
bool execute(SegmenterIdsManager &segmenterIdsManager, const te::rst::Raster &inputRaster, const std::vector< unsigned int > &inputRasterBands, const std::vector< double > &inputRasterGains, const std::vector< double > &inputRasterOffsets, te::rst::Raster &outputRaster, const unsigned int outputRasterBand, const bool enableProgressInterface)
Executes the segmentation strategy.
void reset()
Clear all internal allocated resources and go back to the initial not-initialized state...
BaatzBasedSegment::SegmentFeatures m_features
Raster region growing segmenter strategy factory.
virtual double getDissimilarityIndex(SegmenterRegionGrowingStrategy::Segment const *const segment1Ptr, SegmenterRegionGrowingStrategy::Segment const *const segment2Ptr, SegmenterRegionGrowingStrategy::SegmentFeatures *mergedFeatures) const =0
Returns a dissimilarity index between this and the other segment (normalized between 0 and 1)...
const Parameters & operator=(const Parameters ¶ms)
Baatz based Segments merger.
unsigned int getOptimalBlocksOverlapSize() const
Returns a optimal blocks overlap size (number of border pixels overlapped between blocks...
std::vector< double > m_sums
Segment sum of segment pixel velues.
unsigned int m_xStart
Segment left X coordinate box over the label image.
SegmenterRegionGrowingStrategy::SegmentFeatures * clone() const
Creat a clone of this object.
unsigned int m_edgeLength
Segment edge length.
Mean based Segments merger.
unsigned int m_yBound
Segment lower bound Y coordinate box over the label image.
void exportSegs2Tif(const SegmentsIdsMatrixT &segmentsIds, bool normto8bits, const std::string &fileName)
Export the segments IDs to a tif file.