65#include "DGtal/base/Common.h"
66#include "DGtal/io/readers/VolReader.h"
68#include "DGtal/io/Display3D.h"
69#include "DGtal/io/viewers/Viewer3D.h"
70#include "DGtal/io/DrawWithDisplay3DModifier.h"
71#include "DGtal/images/ImageSelector.h"
72#include "DGtal/images/imagesSetsUtils/SetFromImage.h"
73#include "DGtal/topology/DigitalSurface.h"
74#include "DGtal/topology/DigitalSetBoundary.h"
75#include "DGtal/graph/BreadthFirstVisitor.h"
76#include "DGtal/geometry/surfaces/COBANaivePlaneComputer.h"
77#include "DGtal/helpers/StdDefs.h"
78#include "ConfigExamples.h"
102struct SegmentedPlane {
109 inline VertexSize(
const Vertex & aV, std::size_t aSize )
110 : v( aV ), size( aSize )
115bool operator<(
const VertexSize & vs1,
const VertexSize & vs2 )
117 return vs1.size < vs2.size;
123int main(
int argc,
char** argv )
126 trace.
info() <<
"Segments the surface at given threshold within given volume into digital planes of rational width num/den." << std::endl;
129 string inputFilename = examplesPath +
"samples/Al.100.vol" ;
130 trace.
info() <<
"input file used " << inputFilename << std::endl;
132 unsigned int threshold = 0;
133 trace.
info() <<
"the value that defines the isosurface in the image (an integer between 0 and 255)= " << threshold<< std::endl;
135 unsigned int widthNum = 1;
136 trace.
info() <<
"the numerator of the rational width (a non-null integer) =" << widthNum<< std::endl;
138 unsigned int widthDen = 1;
139 trace.
info() <<
"the denominator of the rational width (a non-null integer)= " << widthDen<< std::endl;
143 QApplication application(argc,argv);
155 bool ok = ks.
init( set3d.
domain().lowerBound(),
156 set3d.
domain().upperBound(),
true );
157 if ( ! ok ) std::cerr <<
"[KSpace.init] Failed." << std::endl;
169 unsigned int nb = digSurf.
size();
172 trace.
beginBlock(
"1) Segmentation first pass. Computes all planes so as to sort vertices by the plane size." );
173 std::map<Vertex,unsigned int> v2size;
175 std::priority_queue<VertexSize> Q;
181 planeComputer.
init( axis, 500, widthNum, widthDen );
190 bool isExtended = planeComputer.
extend( p );
197 Q.push( VertexSize( v, planeComputer.
size() ) );
201 trace.
beginBlock(
"2) Segmentation second pass. Visits vertices from the one with biggest plane to the one with smallest plane." );
202 std::set<Vertex> processedVertices;
203 std::vector<SegmentedPlane*> segmentedPlanes;
204 std::map<Vertex,SegmentedPlane*> v2plane;
206 while ( ! Q.empty() )
211 if ( processedVertices.find( v ) != processedVertices.end() )
214 SegmentedPlane* ptrSegment =
new SegmentedPlane;
215 segmentedPlanes.push_back( ptrSegment );
217 ptrSegment->plane.
init( axis, 500, widthNum, widthDen );
224 if ( processedVertices.find( v ) == processedVertices.end() )
228 bool isExtended = ptrSegment->plane.
extend( p );
231 processedVertices.insert( v );
232 v2plane[ v ] = ptrSegment;
242 ptrSegment->color =
Color( rand() % 256, rand() % 256, rand() % 256, 255 );
250 for ( std::map<Vertex,SegmentedPlane*>::const_iterator
251 it = v2plane.begin(), itE = v2plane.end();
255 viewer << ks.
unsigns( it->first );
257 viewer << Viewer3D<>::updateDisplay;
261 for ( std::vector<SegmentedPlane*>::iterator
262 it = segmentedPlanes.begin(), itE = segmentedPlanes.end();
265 segmentedPlanes.clear();
269 return application.exec();
Aim: This class is useful to perform a breadth-first exploration of a graph given a starting point or...
const Node & current() const
std::pair< Vertex, Data > Node
FIXME.
Aim: A class that contains the COBA algorithm (Emilie Charrier, Lilian Buzer, DGCI2008) for recognizi...
void init(Dimension axis, InternalInteger diameter, InternalInteger widthNumerator=NumberTraits< InternalInteger >::ONE, InternalInteger widthDenominator=NumberTraits< InternalInteger >::ONE)
bool extend(const Point &p)
Structure representing an RGB triple with alpha component.
Aim: A model of CDigitalSurfaceContainer which defines the digital surface as the boundary of a given...
Aim: A wrapper class around a STL associative container for storing sets of digital points within som...
const Domain & domain() const
Aim: Represents a set of n-1-cells in a nD space, together with adjacency relation between these cell...
DigitalSurfaceContainer::SurfelConstIterator ConstIterator
Surfel Vertex
Defines the type for a vertex.
ConstIterator begin() const
ConstIterator end() const
KSpace::SurfelSet SurfelSet
Aim: implements association bewteen points lying in a digital domain and values.
Aim: This class is a model of CCellularGridSpaceND. It represents the cubical grid as a cell complex,...
bool init(const Point &lower, const Point &upper, bool isClosed)
Specifies the upper and lower bounds for the maximal cells in this space.
Dimension sOrthDir(const SCell &s) const
Given a signed surfel [s], returns its orthogonal direction (ie, the coordinate where the surfel is c...
Cell unsigns(const SCell &p) const
Creates an unsigned cell from a signed one.
Point sCoords(const SCell &c) const
Return its digital coordinates.
SCell sDirectIncident(const SCell &p, Dimension k) const
Return the direct incident cell of [p] along [k] (the incident cell along [k])
Aim: Represent adjacencies between surfel elements, telling if it follows an interior to exterior ord...
void beginBlock(const std::string &keyword="")
void progressBar(const double currentValue, const double maximalValue)
virtual void show()
Overload QWidget method in order to add a call to updateList() method (to ensure that the lists are w...
DigitalSurface< MyDigitalSurfaceContainer > MyDigitalSurface
SurfelSet::iterator SurfelSetIterator
MyDigitalSurface::Vertex Vertex
COBANaivePlaneComputer< Z3, InternalInteger > NaivePlaneComputer
MyDigitalSurface::ConstIterator ConstIterator
MyDigitalSurface::SurfelSet SurfelSet
BreadthFirstVisitor< MyDigitalSurface > Visitor
DigitalSetBoundary< KSpace, DigitalSet > MyDigitalSurfaceContainer
DGtal::int64_t InternalInteger
DGtal is the top-level namespace which contains all DGtal functions and types.
boost::int64_t int64_t
signed 94-bit integer.
bool operator<(PointVector< ptDim, LeftEuclideanRing, LeftContainer > const &lhs, PointVector< ptDim, RightEuclideanRing, RightContainer > const &rhs)
Comparison operator on Points/Vectors (LesserThan).
DGtal::uint32_t Dimension
ImageContainerBySTLVector< Domain, Value > Type
static void append(Set &aSet, const ForegroundPredicate &isForeground, typename Image::Domain::ConstIterator itBegin, typename Image::Domain::ConstIterator itEnd)
static ImageContainer importVol(const std::string &filename, const Functor &aFunctor=Functor())
ImageContainerBySTLVector< Domain, Value > Image