#include <iostream>
#include <fstream>
#include <algorithm>
#include "DGtal/base/Common.h"
#include "DGtal/helpers/StdDefs.h"
#include "DGtal/images/ImageContainerBySTLVector.h"
#include "DGtal/io/readers/VolReader.h"
#include "DGtal/io/writers/VolWriter.h"
#include "DGtal/images/SimpleThresholdForegroundPredicate.h"
#include "DGtal/geometry/volumes/distance/DistanceTransformation.h"
#include "DGtal/shapes/implicit/ImplicitBall.h"
#include "DGtal/base/BasicFunctors.h"
#include "DGtal/io/viewers/Viewer3D.h"
#include "DGtal/io/colormaps/GradientColorMap.h"
#include <boost/algorithm/minmax_element.hpp>
int main(
int argc,
char ** argv)
{
typedef ImageContainerBySTLVector<Z3i::Domain, unsigned int>
Image;
QApplication application(argc,argv);
Viewer3D<> viewer;
viewer.show();
itend = image.domain().end(); it != itend; ++it)
viewer << *it;
viewer << DGtal::Viewer3D<>::updateDisplay;
trace.
info() <<
"viewer launched..."<<std::endl;
bool res = application.exec();
typedef functors::SimpleThresholdForegroundPredicate<Image> Predicate;
Predicate binaryshape(image, 0);
typedef DistanceTransformation< Z3i::Space, Predicate, Z3i::L2Metric> DT;
DT distancemap(image.domain(), binaryshape, l2);
QApplication application2(argc,argv);
Viewer3D<> viewer2;
viewer2.show();
DT::Value maxDT = (*boost::first_max_element(distancemap.constRange().begin(),
distancemap.constRange().end()));
GradientColorMap<DT::Value> gradient( 0, maxDT);
trace.
info() <<
"we display the dt map"<<std::endl;
int cpt=0;
itend = distancemap.domain().end(); it != itend;
++it)
if (distancemap(*it) > 0)
{
cpt++;
}
trace.
info() <<
"Got "<<cpt<<
" points."<<std::endl;
viewer2 << DGtal::Viewer3D<>::updateDisplay;
trace.
info() <<
"viewer2 launched..."<<std::endl;
res = res && application2.exec();
Image imageGranulo ( image.domain() );
for(Image::Range::Iterator it = imageGranulo.range().begin(), itend= imageGranulo.range().end();
it != itend; ++it)
*it = 0;
trace.
info() <<
"Computing the granulometry"<<std::endl;
cpt=0;
itend = imageGranulo.domain().end(); it != itend; ++it)
{
if (distancemap(*it) > 0)
{
unsigned int radius = (unsigned int)distancemap(*it);
ImplicitBall<Z3i::Space> ball(
center,radius);
itball != itendball; itball++)
if (imageGranulo.domain().isInside(*itball) &&
( ball(*itball) > 0) &&
(imageGranulo(*itball) < radius))
imageGranulo.setValue(*itball, radius);
cpt++;
}
}
trace.
info() <<
"Granulometry ok nbBalls="<<cpt<< std::endl;
VolWriter<Image, functors::Cast<unsigned char> >::exportVol("granulo.vol", imageGranulo);
QApplication application3(argc,argv);
Viewer3D<> viewer3;
viewer3.show();
Image::Value maxG = (*boost::first_max_element(imageGranulo.constRange().begin(),
imageGranulo.constRange().end()));
GradientColorMap<Image::Value> gradient2( 0, maxG);
cpt=0;
itend = imageGranulo.domain().end(); it != itend;
++it)
if (imageGranulo(*it) > 0)
{
cpt++;
}
trace.
info() <<
"Got "<<cpt<<
" points."<<std::endl;
viewer3 << DGtal::Viewer3D<>::updateDisplay;
trace.
info() <<
"viewer3 launched..."<<std::endl;
return res && application3.exec();
}
Structure representing an RGB triple with alpha component.
static const Color Yellow
TImageContainer::Value Value
static Self diagonal(Component val=1)
MyDigitalSurface::ConstIterator ConstIterator
HyperRectDomain< Space > Domain
Space::RealPoint RealPoint
ExactPredicateLpSeparableMetric< Space, 2 > L2Metric
Point center(const std::vector< Point > &points)
DGtal is the top-level namespace which contains all DGtal functions and types.
Class for adding a Clipping plane through the Viewer3D stream. Realizes the concept CDrawableWithView...
static ImageContainer importVol(const std::string &filename, const Functor &aFunctor=Functor())
int main(int argc, char **argv)
ImageContainerBySTLVector< Domain, Value > Image