DGtal  1.4.beta
Functions
exampleSurfaceATNormals.cpp File Reference
#include <iostream>
#include "ConfigExamples.h"
#include "DGtal/base/Common.h"
#include "DGtal/helpers/StdDefs.h"
#include "DGtal/helpers/Shortcuts.h"
#include "DGtal/helpers/ShortcutsGeometry.h"
#include "DGtal/dec/ATSolver2D.h"
#include "DGtal/dec/DiscreteExteriorCalculusFactory.h"
Include dependency graph for exampleSurfaceATNormals.cpp:

Go to the source code of this file.

Functions

int main (int argc, char **argv)
 

Detailed Description

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
Jacques-Olivier Lachaud (jacqu.nosp@m.es-o.nosp@m.livie.nosp@m.r.la.nosp@m.chaud.nosp@m.@uni.nosp@m.v-sav.nosp@m.oie..nosp@m.fr ) Laboratory of Mathematics (CNRS, UMR 5127), University of Savoie, France
Date
2019/06/09

An example file named exampleSurfaceATNormals.

This file is part of the DGtal library.

Definition in file exampleSurfaceATNormals.cpp.

Function Documentation

◆ main()

int main ( int  argc,
char **  argv 
)

[AT-surface-init]

[AT-surface-init]

[AT-surface-calculus]

[AT-surface-calculus] [AT-surface-solve]

[AT-surface-solve]

[AT-surface-getU2]

[AT-surface-getU2]

[AT-surface-getV0]

[AT-surface-getV0]

Definition at line 48 of file exampleSurfaceATNormals.cpp.

49 {
50  typedef Z3i::KSpace KSpace;
51  typedef Shortcuts< KSpace > SH3;
53  typedef SH3::Surfel Surfel;
54  typedef SH3::Cell Cell;
56 
57  const double alpha_at = 0.1;
58  const double lambda_at = 0.01;
59  const double e1 = 2.0;
60  const double e2 = 0.25;
61  const double er = 2.0;
62 
63  const string volfile = argc > 1 ? argv[ 1 ] : examplesPath + "samples/Al.100.vol";
64  const double threshold = argc > 2 ? atof( argv[ 2 ] ) : 0.5;
65  trace.beginBlock ( "Load vol file -> build digital surface -> estimate II normals." );
67  auto params = SH3::defaultParameters() | SHG3::defaultParameters();
68  auto bimage = SH3::makeBinaryImage( volfile, params );
69  auto K = SH3::getKSpace( bimage, params );
70  auto surface = SH3::makeDigitalSurface( bimage, K, params );
71  auto surfels = SH3::getSurfelRange( surface, params );
72  auto linels = SH3::getCellRange( surface, 1 );
73  auto ii_normals= SHG3::getIINormalVectors( bimage, surfels, params );
74  auto uembedder = SH3::getCellEmbedder( K );
75  auto embedder = SH3::getSCellEmbedder( K );
77  trace.endBlock();
78 
79  trace.beginBlock ( "Creating AT solver for digital surface" );
82  const auto calculus = CalculusFactory::createFromNSCells<2>( surfels.begin(), surfels.end() );
85  ATSolver2D< KSpace > at_solver(calculus, 1);
86  at_solver.initInputVectorFieldU2( ii_normals, surfels.cbegin(), surfels.cend() );
87  at_solver.setUp( alpha_at, lambda_at );
88  at_solver.solveGammaConvergence( e1, e2, er );
90  trace.endBlock();
91 
92  trace.beginBlock ( "Save AT normals as OBJ file" );
94  auto at_normals = ii_normals;
95  at_solver.getOutputVectorFieldU2( at_normals, surfels.cbegin(), surfels.cend() );
97  SH3::RealPoints positions( surfels.size() );
98  std::transform( surfels.cbegin(), surfels.cend(), positions.begin(),
99  [&] (const SH3::SCell& c) { return embedder( c ); } );
100  SH3::Colors colors( surfels.size() );
101  for ( size_t i = 0; i < surfels.size(); i++ )
102  colors[ i ] = SH3::Color( (unsigned char) 255.0*fabs( at_normals[ i ][ 0 ] ),
103  (unsigned char) 255.0*fabs( at_normals[ i ][ 1 ] ),
104  (unsigned char) 255.0*fabs( at_normals[ i ][ 2 ] ) );
105  std::transform( surfels.cbegin(), surfels.cend(), positions.begin(),
106  [&] (const SH3::SCell& c) { return embedder( c ); } );
107 
108  bool ok1 = SH3::saveOBJ( surface, at_normals, SH3::Colors(),
109  "output-surface.obj" );
110  bool ok2 = SH3::saveOBJ( surface, at_normals, colors,
111  "output-surface-at-normals.obj" );
112  bool ok3 = SH3::saveVectorFieldOBJ( positions, at_normals, 0.05, SH3::Colors(),
113  "output-vf-at-normals.obj",
114  SH3::Color( 0, 0, 0 ), SH3::Color::Red );
116  SH3::Scalars features( linels.size() );
117  at_solver.getOutputScalarFieldV0( features, linels.cbegin(), linels.cend(),
118  at_solver.Maximum );
120  SH3::RealPoints f0;
121  SH3::RealVectors f1;
122  for ( size_t i = 0; i < linels.size(); i++ )
123  {
124  if ( features[ i ] < threshold )
125  {
126  const Cell linel = linels[ i ];
127  const Dimension d = * K.uDirs( linel );
128  const Cell p0 = K.uIncident( linel, d, false );
129  const Cell p1 = K.uIncident( linel, d, true );
130  f0.push_back( uembedder( p0 ) );
131  f1.push_back( uembedder( p1 ) - uembedder( p0 ) );
132  }
133  }
134  bool ok4 = SH3::saveVectorFieldOBJ( f0, f1, 0.1, SH3::Colors(),
135  "output-features.obj",
136  SH3::Color( 0, 0, 0 ), SH3::Color::Red );
137 
138  trace.endBlock();
139  return 0;
140 }

References DGtal::Trace::beginBlock(), DGtal::Shortcuts< TKSpace >::defaultParameters(), DGtal::Trace::endBlock(), DGtal::Shortcuts< TKSpace >::getCellEmbedder(), DGtal::Shortcuts< TKSpace >::getCellRange(), DGtal::Shortcuts< TKSpace >::getKSpace(), DGtal::ATSolver2D< TKSpace, TLinearAlgebra >::getOutputScalarFieldV0(), DGtal::ATSolver2D< TKSpace, TLinearAlgebra >::getOutputVectorFieldU2(), DGtal::Shortcuts< TKSpace >::getSCellEmbedder(), DGtal::Shortcuts< TKSpace >::getSurfelRange(), DGtal::ATSolver2D< TKSpace, TLinearAlgebra >::initInputVectorFieldU2(), K, DGtal::Shortcuts< TKSpace >::makeBinaryImage(), DGtal::Shortcuts< TKSpace >::makeDigitalSurface(), DGtal::ATSolver2D< TKSpace, TLinearAlgebra >::Maximum, DGtal::Color::Red, DGtal::Shortcuts< TKSpace >::saveOBJ(), DGtal::Shortcuts< TKSpace >::saveVectorFieldOBJ(), DGtal::ATSolver2D< TKSpace, TLinearAlgebra >::setUp(), DGtal::ATSolver2D< TKSpace, TLinearAlgebra >::solveGammaConvergence(), DGtal::trace, DGtal::KhalimskySpaceND< dim, TInteger >::uDirs(), and DGtal::KhalimskySpaceND< dim, TInteger >::uIncident().

DGtal::Trace::endBlock
double endBlock()
DGtal::Shortcuts::getCellEmbedder
static CanonicCellEmbedder< KSpace > getCellEmbedder(const KSpace &K)
Definition: Shortcuts.h:438
SH3
Shortcuts< KSpace > SH3
Definition: testArithmeticalDSSComputerOnSurfels.cpp:49
DGtal::Shortcuts::Cell
LightDigitalSurface::Cell Cell
Definition: Shortcuts.h:162
DGtal::Shortcuts::getCellRange
static CellRange getCellRange(Cell2Index &c2i, CountedPtr< ::DGtal::DigitalSurface< TDigitalSurfaceContainer > > surface, const Dimension k)
Definition: Shortcuts.h:1399
DGtal::Color
Structure representing an RGB triple with alpha component.
Definition: Color.h:67
DGtal::trace
Trace trace
Definition: Common.h:154
DGtal::Shortcuts::Colors
std::vector< Color > Colors
Definition: Shortcuts.h:192
K
KSpace K
Definition: testCubicalComplex.cpp:62
DGtal::Dimension
DGtal::uint32_t Dimension
Definition: Common.h:137
DGtal::Shortcuts::makeDigitalSurface
static CountedPtr< DigitalSurface > makeDigitalSurface(CountedPtr< TPointPredicate > bimage, const KSpace &K, const Parameters &params=parametersDigitalSurface())
Definition: Shortcuts.h:1209
DGtal::Trace::beginBlock
void beginBlock(const std::string &keyword="")
DGtal::Shortcuts
Aim: This class is used to simplify shape and surface creation. With it, you can create new shapes an...
Definition: Shortcuts.h:104
DGtal::Shortcuts::saveVectorFieldOBJ
static bool saveVectorFieldOBJ(const RealPoints &positions, const RealVectors &vf, double thickness, const Colors &diffuse_colors, std::string objfile, const Color &ambient_color=Color(32, 32, 32), const Color &diffuse_color=Color(200, 200, 255), const Color &specular_color=Color::White)
Definition: Shortcuts.h:1939
DGtal::Shortcuts::RealVectors
std::vector< RealVector > RealVectors
Definition: Shortcuts.h:179
KSpace
Z3i::KSpace KSpace
Definition: testArithmeticalDSSComputerOnSurfels.cpp:48
SHG3
ShortcutsGeometry< Z3i::KSpace > SHG3
Definition: testIntegralInvariantShortcuts.cpp:47
Surfel
KSpace::SCell Surfel
Definition: testArithmeticalDSSComputerOnSurfels.cpp:50
DGtal::Color::Red
static const Color Red
Definition: Color.h:416
DGtal::Shortcuts::defaultParameters
static Parameters defaultParameters()
Definition: Shortcuts.h:203
DGtal::ATSolver2D
Aim: This class solves Ambrosio-Tortorelli functional on a two-dimensional digital space (a 2D grid o...
Definition: ATSolver2D.h:90
DGtal::Shortcuts::Scalars
std::vector< Scalar > Scalars
Definition: Shortcuts.h:178
DGtal::DiscreteExteriorCalculusFactory
Aim: This class provides static members to create DEC structures from various other DGtal structures.
Definition: DiscreteExteriorCalculus.h:70
DGtal::Shortcuts::getSCellEmbedder
static CanonicSCellEmbedder< KSpace > getSCellEmbedder(const KSpace &K)
Definition: Shortcuts.h:446
DGtal::ShortcutsGeometry
Aim: This class is used to simplify shape and surface creation. With it, you can create new shapes an...
Definition: ShortcutsGeometry.h:76
DGtal::Shortcuts::SCell
LightDigitalSurface::SCell SCell
Definition: Shortcuts.h:163
DGtal::KhalimskySpaceND::uDirs
DirIterator uDirs(const Cell &p) const
Given an unsigned cell [p], returns an iterator to iterate over each coordinate the cell spans.
RealVector
Space::RealVector RealVector
Definition: digitalPolyhedronBuilder3D.cpp:82
DGtal::Shortcuts::RealPoints
std::vector< RealPoint > RealPoints
Definition: Shortcuts.h:180
DGtal::Shortcuts::getKSpace
static KSpace getKSpace(const Point &low, const Point &up, Parameters params=parametersKSpace())
Definition: Shortcuts.h:332
DGtal::Shortcuts::Surfel
LightDigitalSurface::Surfel Surfel
Definition: Shortcuts.h:161
DGtal::KhalimskySpaceND::uIncident
Cell uIncident(const Cell &c, Dimension k, bool up) const
Return the forward or backward unsigned cell incident to [c] along axis [k], depending on [up].
DGtal::PointVector
Aim: Implements basic operations that will be used in Point and Vector classes.
Definition: PointVector.h:165
Cell
KSpace::Cell Cell
Definition: testCubicalComplex.cpp:56
DGtal::Shortcuts::saveOBJ
static bool saveOBJ(CountedPtr< ::DGtal::DigitalSurface< TDigitalSurfaceContainer > > digsurf, const TCellEmbedder &embedder, const RealVectors &normals, const Colors &diffuse_colors, std::string objfile, const Color &ambient_color=Color(32, 32, 32), const Color &diffuse_color=Color(200, 200, 255), const Color &specular_color=Color::White)
Definition: Shortcuts.h:1739
DGtal::Shortcuts::getSurfelRange
static SurfelRange getSurfelRange(CountedPtr< ::DGtal::DigitalSurface< TDigitalSurfaceContainer > > surface, const Parameters &params=parametersDigitalSurface())
Definition: Shortcuts.h:1547
DGtal::Shortcuts::makeBinaryImage
static CountedPtr< BinaryImage > makeBinaryImage(Domain shapeDomain)
Definition: Shortcuts.h:561
DGtal::KhalimskyCell< dim, Integer >
DGtal::KhalimskySpaceND
Aim: This class is a model of CCellularGridSpaceND. It represents the cubical grid as a cell complex,...
Definition: KhalimskySpaceND.h:64