DGtal  0.9.3
Functions
exampleFMM3D.cpp File Reference
#include <iostream>
#include "DGtal/io/DrawWithDisplay3DModifier.h"
#include "DGtal/io/Color.h"
#include "DGtal/base/Common.h"
#include "DGtal/helpers/StdDefs.h"
#include "DGtal/shapes/Shapes.h"
#include "DGtal/io/colormaps/HueShadeColorMap.h"
#include "DGtal/io/colormaps/GradientColorMap.h"
#include "ConfigExamples.h"
#include "DGtal/io/viewers/Viewer3D.h"
#include "DGtal/io/readers/VolReader.h"
#include "DGtal/images/ImageContainerBySTLVector.h"
#include "DGtal/images/ImageContainerBySTLMap.h"
#include "DGtal/images/ConstImageAdapter.h"
#include "DGtal/base/BasicFunctors.h"
#include "DGtal/kernel/BasicPointPredicates.h"
#include "DGtal/topology/SurfelAdjacency.h"
#include "DGtal/topology/helpers/FrontierPredicate.h"
#include "DGtal/topology/LightExplicitDigitalSurface.h"
#include "DGtal/geometry/volumes/distance/FMM.h"
Include dependency graph for exampleFMM3D.cpp:

Go to the source code of this file.

Functions

int main (int argc, char **argv)
 

Detailed Description

The aim of this example is to use the FMM (fast marching method) class in order to incrementally compute a signed distance field from a digital surface. The resulting field is visualized with QGLViewer.

This program is free software: you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.

This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.

You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/.

Author
Tristan Roussillon (trist.nosp@m.an.r.nosp@m.oussi.nosp@m.llon.nosp@m.@liri.nosp@m.s.cn.nosp@m.rs.fr ) Laboratoire d'InfoRmatique en Image et Systèmes d'information - LIRIS (CNRS, UMR 5205), CNRS, France
Date
2012/02/23

This file is part of the DGtal library.

Definition in file exampleFMM3D.cpp.

Function Documentation

◆ main()

int main ( int  argc,
char **  argv 
)

FMM types [FMMSimpleTypeDef3D]

[FMMSimpleTypeDef3D]

FMM init [FMMSimpleInit3D]

[FMMSimpleInit3D]

FMM main [FMMUsage3D]

[FMMUsage3D]

Definition at line 80 of file exampleFMM3D.cpp.

References DGtal::GradientColorMap< PValue, PDefaultPreset, PDefaultFirstColor, PDefaultLastColor >::addColor(), DGtal::Trace::beginBlock(), domain(), DGtal::Trace::emphase(), DGtal::Trace::endBlock(), DGtal::Trace::info(), DGtal::KhalimskySpaceND< dim, TInteger >::init(), DGtal::HyperRectDomain< TSpace >::lowerBound(), DGtal::HyperRectDomain< TSpace >::predicate(), DGtal::Viewer3D< Space, KSpace >::show(), DGtal::HyperRectDomain< TSpace >::size(), DGtal::trace, and DGtal::HyperRectDomain< TSpace >::upperBound().

81 {
82 
83 
84  //Parse options
85  //threshold
86  int t =0;
87  //width
88  double maximalDistance = 3.0;
89 
90 
92  // image binarization and surface extraction
93  //types
98 
99  //reading image
100  std::string imageFileName = examplesPath + "samples/Al.100.vol";
101 
102  trace.emphase() << imageFileName <<std::endl;
103  DGtal::trace.beginBlock("image reading...");
104  LabelImage labelImage = VolReader<LabelImage>::importVol( imageFileName);
106 
107  DGtal::trace.beginBlock("binarization...");
108 
111  BinaryImage binaryImage(labelImage, labelImage.domain(), g, thresholder);
112  trace.info() << "threshold: "
113  << t
114  << std::endl;
115 
116  //space and starting bel
117  KSpace ks;
118  Domain domain = labelImage.domain();
119  ks.init( domain.lowerBound(), domain.upperBound(), true );
120  KSpace::SCell bel;
121 
122  try {
123  //getting a bel
124  bel = Surfaces<KSpace>::findABel( ks, binaryImage, domain.size() );
125 
126  trace.info() << "starting bel: "
127  << bel
128  << std::endl;
129 
130  } catch (DGtal::InputException i) {
131  trace.emphase() << "starting bel not found" << std::endl;
132  return 0;
133  }
134 
135  //implicit frontier
137  std::pair<Point,Point> bpair = functor(bel);
138  SurfelPredicate surfelPredicate( ks, binaryImage,
139  binaryImage( bpair.first ),
140  binaryImage( bpair.second ) );
141  Frontier frontier( ks, surfelPredicate,
142  SurfelAdjacency<KSpace::dimension>( true ), bel );
143 
145 
149  typedef ImageContainerBySTLMap<Domain,double> DistanceImage;
150  typedef DigitalSetFromMap<DistanceImage> AcceptedPointSet;
151  typedef Domain::Predicate DomainPredicate;
154 
155  DGtal::trace.beginBlock("FMM...");
156 
159  DistanceImage imageDistance( domain, 0.0 );
160  AcceptedPointSet initialPointSet( imageDistance );
161  FMM::initFromBelsRange( ks, frontier.begin(), frontier.end(),
162  imageDistance, initialPointSet, 0.5 );
164 
167  FMM fmm( imageDistance, initialPointSet, domain.predicate(),
168  domain.size(), maximalDistance );
169  fmm.compute();
170  trace.info() << fmm << std::endl;
172 
174 
176  //visualisation
177  QApplication application(argc,argv);
178  Viewer3D<> viewer;
179  viewer.show();
180 
181  //
182  GradientColorMap<double> colorMap( 0, 2*maximalDistance );
183  colorMap.addColor( Color( 255, 0, 0 ) );
184  colorMap.addColor( Color( 0, 250, 0 ) );
185  for (DistanceImage::const_iterator it = imageDistance.begin(), itEnd = imageDistance.end();
186  it != itEnd; ++it)
187  {
188  Point p = it->first;
189  viewer << CustomColors3D( colorMap(it->second), colorMap(it->second) ) ;
190  viewer << p;
191  }
192  Point p = Point::diagonal(1);
193  Vector extent = (domain.upperBound() - domain.lowerBound()) + p;
194  double a = -extent[0]/2, b = extent[1]/2;
195  double c = 0, mu = (a+b);
196  trace.info() << "clipping plane ("
197  << a << ", " << b << ", " << c << ", " << mu << ")"
198  << std::endl;
199  viewer << CustomColors3D(Color(200, 200, 200, 100),Color(200, 200,200, 20));
200  viewer << ClippingPlane(a,b,c,mu);
201 
202  viewer << Viewer3D<>::updateDisplay;
203  return application.exec();
204 }
void beginBlock(const std::string &keyword="")
Aim: An adapter for viewing an associative image container like ImageContainerBySTLMap as a simple di...
Aim: This class template may be used to (linearly) convert scalar values in a given range into a colo...
Aim: The predicate on surfels that represents the frontier between two regions in an image...
const Domain domain(Point(1, 2), Point(6, 5))
Trace trace
Definition: Common.h:137
virtual void show()
Overload QWidget method in order to add a call to updateList() method (to ensure that the lists are w...
Aim: A utility class for constructing surfaces (i.e. set of (n-1)-cells).
Definition: Surfaces.h:78
const Point & upperBound() const
double endBlock()
Aim: Define a simple default functor that just returns its argument.
Aim: Fast Marching Method (FMM) for nd distance transforms.
Definition: FMM.h:150
Aim: A small functor with an operator () that compares one value to a threshold value according to tw...
const Predicate & predicate() const
std::ostream & emphase()
bool init(const Point &lower, const Point &upper, bool isClosed)
Aim: implements methods to read a "Vol" file format.
Definition: VolReader.h:89
std::ostream & info()
Represents a signed cell in a cellular grid space by its Khalimsky coordinates and a boolean value...
const Point & lowerBound() const
Structure representing an RGB triple with alpha component.
Definition: Color.h:66
Aim: implements a const image adapter with a given domain (i.e. a subdomain) and 2 functors : g for d...
Class for adding a Clipping plane through the Viewer3D stream. Realizes the concept CDrawableWithView...
Aim: This class is a model of CCellularGridSpaceND. It represents the cubical grid as a cell complex...
Aim: A model of CDigitalSurfaceContainer which defines the digital surface as connected surfels...
Aim: transforms a signed cell c into a pair of points corresponding to the signed cells of greater di...