DGtal  0.6.devel
 All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Groups Pages
testImagesSetsUtilities.cpp
1 
35 
36 #include <iostream>
37 #include "DGtal/base/Common.h"
38 
39 #include "DGtal/images/imagesSetsUtils/ImageFromSet.h"
40 #include "DGtal/images/imagesSetsUtils/SetFromImage.h"
41 
42 #include "DGtal/kernel/sets/DigitalSetInserter.h"
43 #include "DGtal/images/ImageHelper.h"
44 
45 #include "DGtal/images/ImageContainerBySTLMap.h"
46 #include "DGtal/images/ImageContainerBySTLVector.h"
47 #include "DGtal/images/ImageSelector.h"
48 
49 #include "DGtal/helpers/StdDefs.h"
50 
51 #include "ConfigTest.h"
52 
54 
55 using namespace std;
56 using namespace DGtal;
57 using namespace Z2i;
58 
60 // Functions for testing ImageHelper functions.
62 
63 template <typename P>
64 struct Norm1
65 {
66  typedef P Point;
67  typedef typename P::Coordinate Value;
68 
69  Value operator()(const Point& p)
70  {
71  return p.norm1();
72  }
73 };
74 
79 bool testImageFromSet()
80 {
81 
83 
84  unsigned int nbok = 0;
85  unsigned int nb = 0;
86 
87  trace.beginBlock ( "Testing ImageFromSet ..." );
88 
89  Point a(0,0);
90  Point b(23,435);
91  Point c(12,12);
92 
93  Domain d(a,b);
94  DigitalSet aSet(d);
95  aSet.insert(c);
96 
97  Image image(d);
98  //assign to the points belonging to aSet the value 128
99  imageFromRangeAndValue(aSet, image, 128);
100  //ie. the value of c is 128 but the value of a remains 0
101  nbok += ( (image(c) == 128)&&(image(a) == 0) ) ? 1 : 0;
102  nb++;
103  trace.info() << "(" << nbok << "/" << nb << ") " << std::endl;
104 
105  Image image2(d);
106  Norm1<Point> n;
107  //fill image2 from n
108  imageFromFunctor(image2, n);
109  nbok += ( (image2(c) == (int)c.norm1())
110  &&(image2(a) == (int)a.norm1())
111  &&(image2(b) == (int)b.norm1()) )? 1 : 0;
112  nb++;
113  trace.info() << "(" << nbok << "/" << nb << ") " << std::endl;
114 
115  Image image3 = image;
116  //fill image3 from image2
117  imageFromImage(image3, image2);
118  //image2 and image3 should be equal,
119  //but both different from image
120  Image::ConstRange rimg = image.constRange();
121  Image::ConstRange rimg2 = image2.constRange();
122  Image::ConstRange rimg3 = image3.constRange();
123  bool flag2 = std::equal(rimg.begin(), rimg.end(), rimg2.begin());
124  bool flag3 = std::equal(rimg.begin(), rimg.end(), rimg3.begin());
125  bool flag23 = std::equal(rimg2.begin(), rimg2.end(), rimg3.begin());
126  nbok += ( (!flag2) && (!flag3) && flag23 )?1:0;
127  nb++;
128  trace.info() << "(" << nbok << "/" << nb << ") " << std::endl;
129 
130  trace.endBlock();
131 
132  return nbok == nb;
133 }
134 
135 bool testSetFromImage()
136 {
137  unsigned int nbok = 0;
138  unsigned int nb = 0;
139 
140  trace.beginBlock ( "Testing SetFromImage ..." );
141 
142  //some points
143  Point a(0,0);
144  Point b(3,3);
145  Point p(1,1);
146  Point q(2,2);
147  Point r(1,2);
148 
149  //image construction
151  Domain d(a,b);
152  Image image(d,1);
153  image.setValue(p,127);
154  image.setValue(q,128);
155  image.setValue(r,10);
156 
157  //image content
158  Image::ConstRange range = image.constRange();
159  std::copy(range.begin(), range.end(), ostream_iterator<Image::Value>(cout, " ") );
160  cout << endl;
161 
162  //set tests
163 
164  DigitalSet aSet(d);
165  DigitalSetInserter<DigitalSet> inserter(aSet);
166  //all points whose value <= 126
167  setFromImage( image, inserter, 126 );
168  //ie, all points except p and q
169  nbok += ( (aSet.find(p) == aSet.end())
170  &&(aSet.find(q) == aSet.end())
171  &&(aSet.size()==(d.size()-2)) ) ? 1 : 0;
172  nb++;
173  trace.info() << "(" << nbok << "/" << nb << ") " << std::endl;
174 
175  DigitalSet aSet2(d);
176  DigitalSetInserter<DigitalSet> inserter2(aSet2);
177  //all points whose value <= 127
178  setFromImage( image, inserter2, 127 );
179  //ie, all points except q
180  nbok += ( (aSet2.find(q) == aSet2.end())
181  &&(aSet2.size()==(d.size()-1)) ) ? 1 : 0;
182  nb++;
183  trace.info() << "(" << nbok << "/" << nb << ") " << std::endl;
184 
185  DigitalSet aSet3(d);
186  DigitalSetInserter<DigitalSet> inserter3(aSet3);
187  //all points whose value <= 128
188  setFromImage( image, inserter3, 128 );
189  //ie, all points
190  nbok += ( aSet3.size()==d.size() ) ? 1 : 0;
191  nb++;
192  trace.info() << "(" << nbok << "/" << nb << ") " << std::endl;
193 
194  DigitalSet aSet4(d);
195  DigitalSetInserter<DigitalSet> inserter4(aSet4);
196  //all points whose value is between 2 and 100
197  setFromImage( image, inserter4, 2, 100 );
198  //ie, only point r
199  nbok += ( (aSet4.find(r)!=aSet4.end())&&(aSet4.size()==1) ) ? 1 : 0;
200  nb++;
201  trace.info() << "(" << nbok << "/" << nb << ") " << std::endl;
202 
203  DigitalSet aSet5(d);
204  DigitalSetInserter<DigitalSet> inserter5(aSet5);
205  //predicate construction
206  typedef std::equal_to<Image::Value> EqualBinaryFunctor;
207  typedef std::binder2nd<EqualBinaryFunctor> ValuePredicate;
208  ValuePredicate equalTo1 (EqualBinaryFunctor(),1);
209  PointFunctorPredicate<Image, ValuePredicate> pred(image, equalTo1);
210  //all points whose value is 1
211  setFromPointsRangeAndPredicate( d.begin(), d.end(), inserter5, pred );
212  //ie all points except p, q, and r
213  nbok += ( (aSet5.find(p) == aSet5.end())
214  &&(aSet5.find(q) == aSet5.end())
215  &&(aSet5.find(r) == aSet5.end())
216  &&(aSet5.size()==(d.size()-3)) ) ? 1 : 0;
217  nb++;
218  trace.info() << "(" << nbok << "/" << nb << ") " << std::endl;
219 
220 
221  return nbok == nb;
222 }
223 
225 // Standard services - public :
226 
227 int main( int argc, char** argv )
228 {
229  trace.beginBlock ( "Testing class ImageHelper functions" );
230  trace.info() << "Args:";
231  for ( int i = 0; i < argc; ++i )
232  trace.info() << " " << argv[ i ];
233  trace.info() << endl;
234 
235  bool res = testImageFromSet() && testSetFromImage();
236  trace.emphase() << ( res ? "Passed." : "Error." ) << endl;
237  trace.endBlock();
238  return res ? 0 : 1;
239 }
240 // //