tuple image_import(const std::string filename) { trace.emphase() << filename << endl; typedef ImageSelector<Domain, unsigned char>::Type Image; const Image image = GenericReader<Image>::import(filename); trace.info() << image << endl; const Point lower_bound = image.domain().lowerBound(); const Point upper_bound = image.domain().upperBound(); const Point delta = upper_bound-lower_bound+Point(1,1,1); trace.info() << lower_bound << " " << upper_bound << endl; const Image::ConstRange range = image.constRange(); list flat; for (Image::ConstRange::ConstIterator iter=range.begin(), iter_end=range.end(); iter!=iter_end; iter++) flat.append(*iter); tuple payload = make_tuple( make_tuple(delta[2], delta[1], delta[0]), flat ); return payload; }
int main( int argc, char** argv ) { trace.beginBlock ( "Example for ConstImageAdapter" ); trace.info() << "Args:"; for ( int i = 0; i < argc; ++i ) trace.info() << " " << argv[ i ]; trace.info() << endl; using namespace Z2i; trace.beginBlock("Image creation"); //domain const Integer size = 5; Point p = Point::diagonal(0); Point q = Point::diagonal(size-1); Domain d(p,q); //image typedef ImageSelector<Domain, int >::Type Image; Image img(d); //fill const int maximalValue = size*size; Image::Range::OutputIterator it = img.range().outputIterator(); for (int i = 0; i < maximalValue; ++i) *it++ = i; //display values Image::ConstRange r = img.constRange(); std::copy( r.begin(), r.end(), std::ostream_iterator<int>(cout,", ") ); cout << endl; trace.endBlock(); const int thresholdValue = maximalValue/2; trace.beginBlock("Implicit thresholding"); //! [ConstImageAdapterConstruction] Thresholder<Image::Value> t( thresholdValue ); ConstImageAdapter<Image, Thresholder<Image::Value>, bool> a(img, t); //! [ConstImageAdapterConstruction] //display values //! [ConstImageAdapterRange] ConstImageAdapter<Image, Thresholder<Image::Value>, bool>::ConstRange ra = a.constRange(); std::copy( ra.begin(), ra.end(), std::ostream_iterator<int>(cout,", ") ); //! [ConstImageAdapterRange] cout << endl; trace.endBlock(); return 0; }
/** * Example of a test. To be completed. * */ bool testImageFromSet() { typedef ImageContainerBySTLVector<Domain,int> Image; unsigned int nbok = 0; unsigned int nb = 0; trace.beginBlock ( "Testing ImageFromSet ..." ); Point a(0,0); Point b(23,435); Point c(12,12); Domain d(a,b); DigitalSet aSet(d); aSet.insert(c); Image image(d); //assign to the points belonging to aSet the value 128 imageFromRangeAndValue(aSet, image, 128); //ie. the value of c is 128 but the value of a remains 0 nbok += ( (image(c) == 128)&&(image(a) == 0) ) ? 1 : 0; nb++; trace.info() << "(" << nbok << "/" << nb << ") " << std::endl; Image image2(d); Norm1<Point> n; //fill image2 from n imageFromFunctor(image2, n); nbok += ( (image2(c) == (int)c.norm1()) &&(image2(a) == (int)a.norm1()) &&(image2(b) == (int)b.norm1()) )? 1 : 0; nb++; trace.info() << "(" << nbok << "/" << nb << ") " << std::endl; Image image3 = image; //fill image3 from image2 imageFromImage(image3, const_cast<Image const&>(image2)); //image2 and image3 should be equal, //but both different from image Image::ConstRange rimg = image.constRange(); Image::ConstRange rimg2 = image2.constRange(); Image::ConstRange rimg3 = image3.constRange(); bool flag2 = std::equal(rimg.begin(), rimg.end(), rimg2.begin()); bool flag3 = std::equal(rimg.begin(), rimg.end(), rimg3.begin()); bool flag23 = std::equal(rimg2.begin(), rimg2.end(), rimg3.begin()); nbok += ( (!flag2) && (!flag3) && flag23 )?1:0; nb++; trace.info() << "(" << nbok << "/" << nb << ") " << std::endl; trace.endBlock(); return nbok == nb; }
int main( int argc, char** argv ) { unsigned int nbok = 0; unsigned int nb = 0; trace.beginBlock ( "Test for ConstImageAdapter" ); trace.info() << "Args:"; for ( int i = 0; i < argc; ++i ) trace.info() << " " << argv[ i ]; trace.info() << endl; using namespace Z2i; trace.beginBlock("Image creation"); //domain const Integer size = 5; Point p = Point::diagonal(0); Point q = Point::diagonal(size-1); Domain d(p,q); //image typedef ImageSelector<Domain, int >::Type Image; Image img(d); //fill const int maximalValue = size*size; Image::Range::OutputIterator it = img.range().outputIterator(); for (int i = 0; i < maximalValue; ++i) *it++ = i; //display values Image::ConstRange r = img.constRange(); std::copy( r.begin(), r.end(), std::ostream_iterator<int>(cout,", ") ); cout << endl; trace.endBlock(); const int thresholdValue = maximalValue/2; trace.beginBlock("Implicit thresholding"); //! [ConstImageAdapterConstruction] DefaultFunctor g; Thresholder<Image::Value> t( thresholdValue ); typedef ConstImageAdapter<Image, Domain, DefaultFunctor, bool, Thresholder<Image::Value> > MyConstImageAdapter; BOOST_CONCEPT_ASSERT(( CConstImage< MyConstImageAdapter > )); MyConstImageAdapter a(img, d, g, t); //! [ConstImageAdapterConstruction] //display values //! [ConstImageAdapterRange] ConstImageAdapter<Image, Domain, DefaultFunctor, bool, Thresholder<Image::Value> >::ConstRange ra = a.constRange(); std::copy( ra.begin(), ra.end(), std::ostream_iterator<int>(cout,", ") ); cout << endl; std::vector<int> to_vector(25); std::copy(ra.begin(), ra.end(), to_vector.begin()); for (int i = 0; i < 25; i++) { if (i<=12) { if (to_vector[i]==1) { cout << "ok, "; nbok += true ? 1 : 0; nb++; } else { cout << "!ok, "; nbok += false ? 1 : 0; nb++; } } else { if (to_vector[i]==0) { cout << "ok, "; nbok += true ? 1 : 0; nb++; } else { cout << "!ok, "; nbok += false ? 1 : 0; nb++; } } } //! [ConstImageAdapterRange] cout << endl; trace.endBlock(); bool res = (nbok == nb); trace.emphase() << ( res ? "Passed." : "Error." ) << endl; trace.endBlock(); return res ? 0 : 1; }
bool testSetFromImage() { unsigned int nbok = 0; unsigned int nb = 0; trace.beginBlock ( "Testing SetFromImage ..." ); //some points Point a(0,0); Point b(3,3); Point p(1,1); Point q(2,2); Point r(1,2); //image construction typedef ImageContainerBySTLMap<Domain,int> Image; Domain d(a,b); Image image(d,1); image.setValue(p,127); image.setValue(q,128); image.setValue(r,10); //image content Image::ConstRange range = image.constRange(); std::copy(range.begin(), range.end(), ostream_iterator<Image::Value>(cout, " ") ); cout << endl; //set tests DigitalSet aSet(d); DigitalSetInserter<DigitalSet> inserter(aSet); //all points whose value <= 126 setFromImage( image, inserter, 126 ); //ie, all points except p and q nbok += ( (aSet.find(p) == aSet.end()) &&(aSet.find(q) == aSet.end()) &&(aSet.size()==(d.size()-2)) ) ? 1 : 0; nb++; trace.info() << "(" << nbok << "/" << nb << ") " << std::endl; DigitalSet aSet2(d); DigitalSetInserter<DigitalSet> inserter2(aSet2); //all points whose value <= 127 setFromImage( image, inserter2, 127 ); //ie, all points except q nbok += ( (aSet2.find(q) == aSet2.end()) &&(aSet2.size()==(d.size()-1)) ) ? 1 : 0; nb++; trace.info() << "(" << nbok << "/" << nb << ") " << std::endl; DigitalSet aSet3(d); DigitalSetInserter<DigitalSet> inserter3(aSet3); //all points whose value <= 128 setFromImage( image, inserter3, 128 ); //ie, all points nbok += ( aSet3.size()==d.size() ) ? 1 : 0; nb++; trace.info() << "(" << nbok << "/" << nb << ") " << std::endl; DigitalSet aSet4(d); DigitalSetInserter<DigitalSet> inserter4(aSet4); //all points whose value is between 2 and 100 setFromImage( image, inserter4, 2, 100 ); //ie, only point r nbok += ( (aSet4.find(r)!=aSet4.end())&&(aSet4.size()==1) ) ? 1 : 0; nb++; trace.info() << "(" << nbok << "/" << nb << ") " << std::endl; DigitalSet aSet5(d); DigitalSetInserter<DigitalSet> inserter5(aSet5); //predicate construction typedef std::equal_to<Image::Value> EqualBinaryFunctor; typedef std::binder2nd<EqualBinaryFunctor> ValuePredicate; ValuePredicate equalTo1 (EqualBinaryFunctor(),1); functors::PointFunctorPredicate<Image, ValuePredicate> pred(image, equalTo1); //all points whose value is 1 setFromPointsRangeAndPredicate( d.begin(), d.end(), inserter5, pred ); //ie all points except p, q, and r nbok += ( (aSet5.find(p) == aSet5.end()) &&(aSet5.find(q) == aSet5.end()) &&(aSet5.find(r) == aSet5.end()) &&(aSet5.size()==(d.size()-3)) ) ? 1 : 0; nb++; trace.info() << "(" << nbok << "/" << nb << ") " << std::endl; return nbok == nb; }