44 #include "DGtal/base/Common.h"
45 #include "DGtal/base/Exceptions.h"
47 #include "DGtal/io/boards/Board2D.h"
48 #include "DGtal/io/Color.h"
50 #include "DGtal/base/Circulator.h"
52 #include "DGtal/geometry/curves/ArithmeticalDSS.h"
53 #include "DGtal/geometry/curves/FreemanChain.h"
54 #include "DGtal/geometry/curves/GreedySegmentation.h"
55 #include "DGtal/geometry/curves/SaturatedSegmentation.h"
58 #include "ConfigTest.h"
61 using namespace DGtal;
63 using namespace LibBoard;
74 template <
typename Iterator,
typename Board>
75 void draw(
const Iterator& itb,
const Iterator& ite,
Board& aBoard)
78 for (Iterator i(itb); i != ite; ++i) {
80 typename Iterator::SegmentComputer segment(*i);
82 aBoard <<
SetMode(segment.className(),
"BoundingBox" )
92 template <
typename Iterator,
typename Board>
93 void drawCCP(
const Iterator& itb,
const Iterator& ite,
Board& aBoard)
96 typedef typename Iterator::SegmentComputer::ConstIterator PointIterator;
98 aBoard <<
SetMode(
"ArithmeticalDSS",
"BoundingBox" );
99 string aStyleName =
"ArithmeticalDSS/BoundingBox";
101 for (Iterator i(itb); i != ite; ++i) {
106 if ( !(i.intersectNext() && i.intersectPrevious()) ) {
114 PointIterator begin = i->begin(); --begin;
115 PointIterator end = i->end();
119 int omega = i->getOmega();
122 if ( (i->getRemainder(begin)<=mu-1)&&
123 (i->getRemainder(end)<=mu-1) ) {
125 }
else if ( (i->getRemainder(begin)>=mu+omega)&&
126 (i->getRemainder(end)>=mu+omega) ) {
128 }
else if ( (i->getRemainder(begin)>=mu+omega)&&
129 (i->getRemainder(end)<=mu-1) ) {
131 }
else if ( (i->getRemainder(begin)<=mu-1)&&
132 (i->getRemainder(end)>=mu+omega) ) {
151 template <
typename Iterator,
typename Board>
152 void segmentationIntoDSSs(
const Iterator& itb,
const Iterator& ite,
153 const Iterator& sitb,
const Iterator& site,
154 const string& aMode,
Board& aBoard)
160 RecognitionAlgorithm algo;
161 Segmentation s(itb,ite,algo);
162 s.setSubRange(sitb,site);
165 typename Segmentation::SegmentComputerIterator i = s.begin();
166 typename Segmentation::SegmentComputerIterator end = s.end();
168 draw<typename Segmentation::SegmentComputerIterator, Board>
176 template <
typename Iterator,
typename Board>
177 void segmentationIntoMaximalDSSs(
const Iterator& itb,
const Iterator& ite,
178 const Iterator& sitb,
const Iterator& site,
179 const string& aMode,
Board& aBoard)
185 RecognitionAlgorithm algo;
186 Segmentation s(itb,ite,algo);
187 s.setSubRange(sitb,site);
190 typename Segmentation::SegmentComputerIterator i = s.begin();
191 typename Segmentation::SegmentComputerIterator end = s.end();
193 drawCCP<typename Segmentation::SegmentComputerIterator, Board>
202 bool greedySegmentationVisualTest()
205 typedef int Coordinate;
211 std::string filename = testPath +
"samples/manche.fc";
214 fst.open (filename.c_str(), std::ios::in);
223 aBoard <<
SetMode(
"PointVector",
"Grid") << fc;
225 segmentationIntoDSSs<ConstIterator,Board2D>
226 (fc.begin(),fc.end(),
230 aBoard.
saveEPS(
"WholeOpenCurveWithItMode1.eps");
238 aBoard <<
SetMode(
"PointVector",
"Grid") << fc;
240 segmentationIntoDSSs<ConstIterator,Board2D>
241 (fc.begin(),fc.end(),
243 "DoNotTruncate",aBoard);
245 aBoard.
saveEPS(
"WholeOpenCurveWithItMode3.eps");
252 aBoard <<
SetMode(
"PointVector",
"Grid") << fc;
254 segmentationIntoDSSs<ConstIterator,Board2D>
255 (fc.begin(),fc.end(),
257 "Truncate+1",aBoard);
259 aBoard.
saveEPS(
"WholeOpenCurveWithItMode2.eps");
267 typedef vector<PointVector<2,Coordinate> >
Curve;
268 typedef Curve::const_iterator RAConstIterator;
271 vPts.assign ( fc.begin(), fc.end() );
273 RAConstIterator start = vPts.begin()+15;
274 RAConstIterator stop = vPts.begin()+200;
276 trace.
info() << *start <<
" " << *stop << endl;
281 aBoard <<
SetMode(
"PointVector",
"Grid") << fc;
282 aBoard <<
SetMode(
"PointVector",
"Paving") << *start << *stop;
284 segmentationIntoDSSs<RAConstIterator,Board2D>
285 (vPts.begin(),vPts.end(),
289 aBoard.
saveEPS(
"PartOpenCurveWithItMode1.eps");
296 aBoard <<
SetMode(
"PointVector",
"Grid") << fc;
297 aBoard <<
SetMode(
"PointVector",
"Paving") << *start << *stop;
299 segmentationIntoDSSs<RAConstIterator,Board2D>
300 (vPts.begin(),vPts.end(),
302 "Truncate+1",aBoard);
304 aBoard.
saveEPS(
"PartOpenCurveWithItMode2.eps");
312 aBoard <<
SetMode(
"PointVector",
"Grid") << fc;
313 aBoard <<
SetMode(
"PointVector",
"Paving") << *start << *stop;
315 segmentationIntoDSSs<RAConstIterator,Board2D>
316 (vPts.begin(),vPts.end(),
318 "DoNotTruncate",aBoard);
320 aBoard.
saveEPS(
"PartOpenCurveWithItMode3.eps");
329 ConstCirculator c(vPts.begin(),vPts.begin(),vPts.end());
331 trace.
beginBlock(
"Segmentation of a whole range (mode1) with circulators");
334 aBoard <<
SetMode(
"PointVector",
"Grid") << fc;
336 segmentationIntoDSSs<ConstCirculator,Board2D>
340 aBoard.
saveEPS(
"WholeOpenCurveWithCircMode1.eps");
344 trace.
beginBlock(
"Segmentation of a whole range (mode2) with circulators");
347 aBoard <<
SetMode(
"PointVector",
"Grid") << fc;
349 segmentationIntoDSSs<ConstCirculator,Board2D>
351 "Truncate+1",aBoard);
353 aBoard.
saveEPS(
"WholeOpenCurveWithCircMode2.eps");
358 trace.
beginBlock(
"Segmentation of a whole range (mode3) with circulators");
361 aBoard <<
SetMode(
"PointVector",
"Grid") << fc;
363 segmentationIntoDSSs<ConstCirculator,Board2D>
365 "DoNotTruncate",aBoard);
367 aBoard.
saveEPS(
"WholeOpenCurveWithCircMode3.eps");
374 ConstCirculator cstart(start,vPts.begin(),vPts.end());
375 ConstCirculator cstop(stop,vPts.begin(),vPts.end());
377 trace.
beginBlock(
"Segmentation of a subrange (mode1) with circulators");
380 aBoard <<
SetMode(
"PointVector",
"Grid") << fc;
381 aBoard <<
SetMode(
"PointVector",
"Paving") << *start << *stop;
383 segmentationIntoDSSs<ConstCirculator,Board2D>
388 aBoard.
saveEPS(
"PartOpenCurveWithCircMode1.eps");
392 trace.
beginBlock(
"Segmentation of a subrange (mode2) with circulators");
395 aBoard <<
SetMode(
"PointVector",
"Grid") << fc;
396 aBoard <<
SetMode(
"PointVector",
"Paving") << *start << *stop;
398 segmentationIntoDSSs<ConstCirculator,Board2D>
401 "Truncate+1",aBoard);
403 aBoard.
saveEPS(
"PartOpenCurveWithCircMode2.eps");
408 trace.
beginBlock(
"Segmentation of a subrange (mode3) with circulators");
411 aBoard <<
SetMode(
"PointVector",
"Grid") << fc;
412 aBoard <<
SetMode(
"PointVector",
"Paving") << *start << *stop;
414 segmentationIntoDSSs<ConstCirculator,Board2D>
417 "DoNotTruncate",aBoard);
419 aBoard.
saveEPS(
"PartOpenCurveWithCircMode3.eps");
426 std::stringstream ss(stringstream::in | stringstream::out);
427 ss <<
"31 16 1112121212121221212121221212212222232232323332333333332333332330333033003030000010001001001000100010101010111" << endl;
433 vPts2.assign( fc2.begin(), fc2.end() );
434 vPts2.insert( vPts2.end(), fc2.begin(), fc2.end() );
435 vPts2.insert( vPts2.end(), fc2.begin(), fc2.end() );
439 RAConstIterator start2 = vPts2.begin() + fc2.size()+1;
440 RAConstIterator stop2 = start2 + fc2.size()+1;
442 trace.
info() << *start2 <<
" " << *stop2 << endl;
444 trace.
beginBlock(
"Segmentation of a subrange of a duplicated range (mode1)");
447 aBoard <<
SetMode(
"PointVector",
"Grid") << fc2;
448 aBoard <<
SetMode(
"PointVector",
"Paving") << *start2 << *stop2;
450 segmentationIntoDSSs<RAConstIterator,Board2D>
451 (vPts2.begin(),vPts2.end(),
455 aBoard.
saveEPS(
"DuplicatedCurveWithItMode1.eps");
459 trace.
beginBlock(
"Segmentation of a subrange of a duplicated range (mode2)");
462 aBoard <<
SetMode(
"PointVector",
"Grid") << fc2;
463 aBoard <<
SetMode(
"PointVector",
"Paving") << *start2 << *stop2;
465 segmentationIntoDSSs<RAConstIterator,Board2D>
466 (vPts2.begin(),vPts2.end(),
468 "Truncate+1",aBoard);
470 aBoard.
saveEPS(
"DuplicatedCurveWithItMode2.eps");
475 trace.
beginBlock(
"Segmentation of a subrange of a duplicated range (mode3)");
478 aBoard <<
SetMode(
"PointVector",
"Grid") << fc2;
479 aBoard <<
SetMode(
"PointVector",
"Paving") << *start2 << *stop2;
481 segmentationIntoDSSs<RAConstIterator,Board2D>
482 (vPts2.begin(),vPts2.end(),
484 "DoNotTruncate",aBoard);
486 aBoard.
saveEPS(
"DuplicatedCurveWithItMode3.eps");
494 ConstCirculator c2(start2,start2,stop2);
496 trace.
beginBlock(
"Segmentation of a whole range (mode1) with circulators");
499 aBoard <<
SetMode(
"PointVector",
"Grid") << fc2;
501 segmentationIntoDSSs<ConstCirculator,Board2D>
505 aBoard.
saveEPS(
"ClosedCurveWithCircMode1.eps");
509 trace.
beginBlock(
"Segmentation of a whole range (mode2) with circulators");
512 aBoard <<
SetMode(
"PointVector",
"Grid") << fc2;
514 segmentationIntoDSSs<ConstCirculator,Board2D>
516 "Truncate+1",aBoard);
518 aBoard.
saveEPS(
"ClosedCurveWithCircMode2.eps");
523 trace.
beginBlock(
"Segmentation of a whole range (mode3) with circulators");
526 aBoard <<
SetMode(
"PointVector",
"Grid") << fc2;
528 segmentationIntoDSSs<ConstCirculator,Board2D>
530 "DoNotTruncate",aBoard);
532 aBoard.
saveEPS(
"ClosedCurveWithCircMode3.eps");
551 bool SaturatedSegmentationVisualTest()
554 typedef int Coordinate;
558 std::string filename = testPath +
"samples/manche.fc";
561 fst.open (filename.c_str(), std::ios::in);
570 aBoard <<
SetMode(
"PointVector",
"Grid") << fc;
572 segmentationIntoMaximalDSSs<ConstIterator,Board2D>
573 (fc.begin(),fc.end(),
577 aBoard.
saveEPS(
"MSOpenCurve2.eps");
584 aBoard <<
SetMode(
"PointVector",
"Grid") << fc;
586 segmentationIntoMaximalDSSs<ConstIterator,Board2D>
587 (fc.begin(),fc.end(),
589 "MostCentered",aBoard);
591 aBoard.
saveEPS(
"MSOpenCurve3.eps");
598 aBoard <<
SetMode(
"PointVector",
"Grid") << fc;
600 segmentationIntoMaximalDSSs<ConstIterator,Board2D>
601 (fc.begin(),fc.end(),
605 aBoard.
saveEPS(
"MSOpenCurve4.eps");
612 typedef vector<PointVector<2,Coordinate> > Curve;
613 typedef Curve::const_iterator RAConstIterator;
616 vPts.assign ( fc.begin(), fc.end() );
618 RAConstIterator start = vPts.begin()+190;
619 RAConstIterator stop = vPts.begin()+400;
621 trace.
info() << *start <<
" " << *stop << endl;
627 aBoard <<
SetMode(
"PointVector",
"Grid") << fc;
628 aBoard <<
SetMode(
"PointVector",
"Paving") << *start << *stop;
630 segmentationIntoMaximalDSSs<RAConstIterator,Board2D>
631 (vPts.begin(),vPts.end(),
635 aBoard.
saveEPS(
"MSOpenCurvePart2.eps");
639 trace.
beginBlock(
"saturated Segmentation of a subrange (mode=MostCentered)");
642 aBoard <<
SetMode(
"PointVector",
"Grid") << fc;
643 aBoard <<
SetMode(
"PointVector",
"Paving") << *start << *stop;
645 segmentationIntoMaximalDSSs<RAConstIterator,Board2D>
646 (vPts.begin(),vPts.end(),
648 "MostCentered",aBoard);
650 aBoard.
saveEPS(
"MSOpenCurvePart3.eps");
657 aBoard <<
SetMode(
"PointVector",
"Grid") << fc;
658 aBoard <<
SetMode(
"PointVector",
"Paving") << *start << *stop;
660 segmentationIntoMaximalDSSs<RAConstIterator,Board2D>
661 (vPts.begin(),vPts.end(),
665 aBoard.
saveEPS(
"MSOpenCurvePart4.eps");
674 ConstCirculator c(vPts.begin(),vPts.begin(),vPts.end());
677 trace.
beginBlock(
"Segmentation of a range bounded by circulators (mode=First)");
680 aBoard <<
SetMode(
"PointVector",
"Grid") << fc;
682 segmentationIntoMaximalDSSs<ConstCirculator,Board2D>
686 aBoard.
saveEPS(
"MSOpenCurveWithCirc2.eps");
690 trace.
beginBlock(
"Segmentation of a range bounded by circulators (mode=MostCentered)");
693 aBoard <<
SetMode(
"PointVector",
"Grid") << fc;
695 segmentationIntoMaximalDSSs<ConstCirculator,Board2D>
697 "MostCentered",aBoard);
699 aBoard.
saveEPS(
"MSOpenCurveWithCirc3.eps");
703 trace.
beginBlock(
"Segmentation of a range bounded by circulators (mode=Last)");
706 aBoard <<
SetMode(
"PointVector",
"Grid") << fc;
708 segmentationIntoMaximalDSSs<ConstCirculator,Board2D>
712 aBoard.
saveEPS(
"MSOpenCurveWithCirc4.eps");
720 ConstCirculator cstart(start,vPts.begin(),vPts.end());
721 ConstCirculator cstop(stop,vPts.begin(),vPts.end());
724 trace.
beginBlock(
"Segmentation of a subrange with circulators (mode=First)");
727 aBoard <<
SetMode(
"PointVector",
"Grid") << fc;
728 aBoard <<
SetMode(
"PointVector",
"Paving") << *cstart << *cstop;
730 segmentationIntoMaximalDSSs<ConstCirculator,Board2D>
734 aBoard.
saveEPS(
"MSOpenCurvePartWithCirc2.eps");
738 trace.
beginBlock(
"Segmentation of a subrange with circulators (mode=MostCentered)");
741 aBoard <<
SetMode(
"PointVector",
"Grid") << fc;
742 aBoard <<
SetMode(
"PointVector",
"Paving") << *cstart << *cstop;
744 segmentationIntoMaximalDSSs<ConstCirculator,Board2D>
746 "MostCentered",aBoard);
748 aBoard.
saveEPS(
"MSOpenCurvePartWithCirc3.eps");
752 trace.
beginBlock(
"Segmentation of a subrange with circulators (mode=Last)");
755 aBoard <<
SetMode(
"PointVector",
"Grid") << fc;
756 aBoard <<
SetMode(
"PointVector",
"Paving") << *cstart << *cstop;
758 segmentationIntoMaximalDSSs<ConstCirculator,Board2D>
762 aBoard.
saveEPS(
"MSOpenCurvePartWithCirc4.eps");
769 std::stringstream ss(stringstream::in | stringstream::out);
770 ss <<
"31 16 1112121212121221212121221212212222232232323332333333332333332330333033003030000010001001001000100010101010111" << endl;
776 vPts2.assign( fc2.begin(), fc2.end() );
777 vPts2.insert( vPts2.end(), fc2.begin(), fc2.end() );
778 vPts2.insert( vPts2.end(), fc2.begin(), fc2.end() );
780 RAConstIterator start2 = vPts2.begin() + fc2.size()+1;
781 RAConstIterator stop2 = start2 + fc2.size()+1;
783 trace.
info() << *start2 <<
" " << *stop2 << endl;
785 trace.
beginBlock(
"Satured Segmentation of a duplicated range (mode2)");
788 aBoard <<
SetMode(
"PointVector",
"Grid") << fc2;
789 aBoard <<
SetMode(
"PointVector",
"Paving") << *start2 << *stop2;
791 segmentationIntoMaximalDSSs<RAConstIterator,Board2D>
792 (vPts2.begin(),vPts2.end(),
796 aBoard.
saveEPS(
"MSClosedCurveWithIt2.eps");
800 trace.
beginBlock(
"Satured Segmentation of a duplicated range (mode3)");
803 aBoard <<
SetMode(
"PointVector",
"Grid") << fc2;
804 aBoard <<
SetMode(
"PointVector",
"Paving") << *start2 << *stop2;
806 segmentationIntoMaximalDSSs<RAConstIterator,Board2D>
807 (vPts2.begin(),vPts2.end(),
809 "MostCentered",aBoard);
811 aBoard.
saveEPS(
"MSClosedCurveWithIt3.eps");
816 trace.
beginBlock(
"Satured Segmentation of a duplicated range (mode4)");
819 aBoard <<
SetMode(
"PointVector",
"Grid") << fc2;
820 aBoard <<
SetMode(
"PointVector",
"Paving") << *start2 << *stop2;
822 segmentationIntoMaximalDSSs<RAConstIterator,Board2D>
823 (vPts2.begin(),vPts2.end(),
827 aBoard.
saveEPS(
"MSClosedCurveWithIt4.eps");
836 vPts3.assign( fc2.begin(), fc2.end() );
838 ConstCirculator c2(vPts3.begin(),vPts3.begin(),vPts3.end());
840 trace.
beginBlock(
"saturated Segmentation of a closed digital curve (mode=First)");
843 aBoard <<
SetMode(
"PointVector",
"Grid") << fc2;
844 aBoard <<
SetMode(
"PointVector",
"Paving") << *c2;
846 segmentationIntoMaximalDSSs<ConstCirculator,Board2D>
850 aBoard.
saveEPS(
"MSClosedCurveWithCirc2.eps");
854 trace.
beginBlock(
"saturated Segmentation of a closed digital curve (mode=MostCentered)");
857 aBoard <<
SetMode(
"PointVector",
"Grid") << fc2;
858 aBoard <<
SetMode(
"PointVector",
"Paving") << *c2;
860 segmentationIntoMaximalDSSs<ConstCirculator,Board2D>
862 "MostCentered",aBoard);
864 aBoard.
saveEPS(
"MSClosedCurveWithCirc3.eps");
868 trace.
beginBlock(
"saturated Segmentation of a closed digital curve (mode=Last)");
871 aBoard <<
SetMode(
"PointVector",
"Grid") << fc2;
872 aBoard <<
SetMode(
"PointVector",
"Paving") << *c2;
874 segmentationIntoMaximalDSSs<ConstCirculator,Board2D>
878 aBoard.
saveEPS(
"MSClosedCurveWithCirc4.eps");
892 bool SaturatedSegmentationTest()
895 typedef int Coordinate;
898 std::string filename = testPath +
"samples/BigBall2.fc";
901 fst.open (filename.c_str(), std::ios::in);
907 vPts.assign(fc.begin(),fc.end());
909 typedef vector<Point>::const_iterator ConstIterator;
920 RecognitionAlgorithm algo;
921 Segmentation s(c,c,algo);
924 Segmentation::SegmentComputerIterator begin = s.begin();
925 Segmentation::SegmentComputerIterator end = s.end();
927 unsigned int compteur = 0;
928 for (Segmentation::SegmentComputerIterator i(begin); i != end; ++i) {
932 trace.
info() <<
"# nbpts nbsegments " << endl;
933 trace.
info() << fc.size()+1 <<
" " << compteur << endl;
937 return (compteur == 4295);
944 int main(
int argc,
char **argv)
947 trace.
beginBlock (
"Testing class GreedyDecomposition and SaturatedSegmentation" );
949 for (
int i = 0; i < argc; ++i )
953 bool res = greedySegmentationVisualTest()
954 && SaturatedSegmentationVisualTest()
955 && SaturatedSegmentationTest()
958 trace.
emphase() << ( res ?
"Passed." :
"Error." ) << endl;