DGtal 1.4.2
Loading...
Searching...
No Matches
DigitalSurfaceRegularization.h
1
17#pragma once
18
31#if defined(DigitalSurfaceRegularization_RECURSES)
32#error Recursive header files inclusion detected in DigitalSurfaceRegularization.h
33#else // defined(DigitalSurfaceRegularization_RECURSES)
35#define DigitalSurfaceRegularization_RECURSES
36
37#if !defined DigitalSurfaceRegularization_h
39#define DigitalSurfaceRegularization_h
40
42// Inclusions
43#include <iostream>
44#include "DGtal/base/Common.h"
45#include "DGtal/base/ConstAlias.h"
46#include "DGtal/topology/DigitalSurface.h"
47
48#include "DGtal/helpers/StdDefs.h"
49#include "DGtal/helpers/Shortcuts.h"
50#include "DGtal/helpers/ShortcutsGeometry.h"
52
53namespace DGtal
54 {
55
57 // template class DigitalSurfaceRegularization
87 template <typename TDigitalSurface>
89 {
90 // ----------------------- Standard services ------------------------------
91 public:
92
94 typedef TDigitalSurface DigSurface;
96 typedef typename TDigitalSurface::DigitalSurfaceContainer DigitalSurfaceContainer;
98
101
104
106 typedef std::vector<Z3i::RealPoint> Positions;
107
109 typedef std::vector<Z3i::RealVector> Normals;
110
119
124
130
136
143
150
151 // ----------------------- Interface --------------------------------------
152 public:
153
161 void attachNormalVectors(const std::function<SHG3::RealVector(SH3::SCell&)> &normalFunc);
162
173
174
184 void init(const double alpha = 0.001,
185 const double beta = 1.0,
186 const double gamma = 0.05);
187
188
199 void init(ConstAlias< std::vector<double> > alphas,
200 ConstAlias< std::vector<double> > betas,
201 ConstAlias< std::vector<double> > gammas);
202
203
213
214
226
227
251 template <typename AdvectionFunction>
252 double regularize(const unsigned int nbIters,
253 const double dt,
254 const double epsilon,
255 const AdvectionFunction & advectionFunc);
273 double regularize(const unsigned int nbIters = 200,
274 const double dt = 1.0,
275 const double epsilon = 0.0001)
276 {
277 return regularize(nbIters,dt,epsilon,
278 [](SHG3::RealPoint& p,SHG3::RealPoint& o,SHG3::RealVector& v){ (void)o; p += v; });
279 }
280
281
282
293 const SHG3::RealPoint &orig,
294 const SHG3::RealVector &v)
295 {
296 p += v;
297 for(auto i=0; i < 3; ++i)
298 if ((p[i]-orig[i])> 0.5) p[i]=orig[i]+0.5;
299 else
300 if ((p[i]-orig[i])< -0.5) p[i]=orig[i]-0.5;
301 }
302
303
312 {
313 ASSERT_MSG(myInit, "The init() method must be called first.");
314 ASSERT_MSG(myK.uDim(aPointel) == 0, "The cell must be a pointel (0-cell)");
315 return myRegularizedPositions[ myPointelIndex[ aPointel] ];
316 }
317
324 {
325 ASSERT_MSG(myInit, "The init() method must be called first.");
327 }
334 {
335 ASSERT_MSG(myInit, "The init() method must be called first.");
336 return myOriginalPositions;
337 }
344 {
345 ASSERT_MSG(myInit, "The init() method must be called first.");
346 return myPointelIndex;
347 }
353 const Normals & getNormalVectors() const
354 {
355 ASSERT_MSG(myInit, "The init() method must be called first.");
356 return myNormals;
357 }
358
365 {
366 ASSERT_MSG(myInit, "The init() method must be called first.");
367 return mySurfelIndex;
368 }
369
374 void reset()
375 {
376 ASSERT_MSG(myInit, "The init() method must be called first.");
377 std::copy(myOriginalPositions.begin(), myOriginalPositions.end(), myRegularizedPositions.begin());
378 }
379
380
381 // ----------------------- Services --------------------------------------
382
383
388 void selfDisplay ( std::ostream & out ) const;
389
394 bool isValid() const;
395
400
405
406 // ------------------------- Private methods --------------------------------
407 private:
408
412 void cacheInit();
413
414
415 // ------------------------- Private Datas --------------------------------
416 private:
417
419 double myAlpha;
421 double myBeta;
423 double myGamma;
424
426 const std::vector<double> *myAlphas;
428 const std::vector<double> *myBetas;
430 const std::vector<double> *myGammas;
431
434
436 bool myInit;
437
440
443
446
449
452
455
456
457
458 // ---------------------------------------------------------------
460
463
466
469
472
475
477 std::vector< SH3::Idx > myAlignPointelsIdx;
479 std::vector< SH3::Cell > myAlignPointels;
481 std::vector<unsigned char> myNumberAdjEdgesToPointel;
483 std::vector< SH3::Idx > myFairnessPointelsIdx;
485 std::vector< unsigned char > myNbAdjacent;
487 SH3::PolygonalSurface::FaceRange myFaces;
488
489 }; // end of class DigitalSurfaceRegularization
490
491
498 template <typename T>
499 std::ostream&
500 operator<< ( std::ostream & out, const DigitalSurfaceRegularization<T> & object );
501
502 } // namespace surfaces
503
504
506// Includes inline functions/methods if necessary.
507#include "DGtal/geometry/surfaces/DigitalSurfaceRegularization.ih"
508// //
510
511#endif // !defined DigitalSurfaceRegularization_h
512
513#undef DigitalSurfaceRegularization_RECURSES
514#endif // else defined(DigitalSurfaceRegularization_RECURSES)
Aim: This class encapsulates its parameter class so that to indicate to the user that the object/poin...
Definition ConstAlias.h:187
Aim: Smart pointer based on reference counts.
Definition CountedPtr.h:80
Aim: Implements Digital Surface Regularization as described in coeurjolly17regdgci.
Positions myOriginalPositions
Copy of the input pointels positions.
Positions myRegularizedPositions
Regularized vertices.
const std::vector< double > * myBetas
Alignment attachment term local coefficients.
static void clampedAdvection(SHG3::RealPoint &p, const SHG3::RealPoint &orig, const SHG3::RealVector &v)
std::vector< SH3::Idx > myAlignPointelsIdx
Indices of adjacent pointels for the Alignement energy term.
void init(const double alpha=0.001, const double beta=1.0, const double gamma=0.05)
Initialize the parameters of the energy function.
bool myConstantCoeffs
Flag if the gradient has constant weights for the init method and gradient.
void attachConvolvedTrivialNormalVectors(const Parameters someParams=SH3::defaultParameters()|SHG3::defaultParameters())
std::vector< SH3::Cell > myAlignPointels
Adjacent pointels for the Alignement energy term.
TDigitalSurface::DigitalSurfaceContainer DigitalSurfaceContainer
Digital Surface Container type.
SH3::SurfelRange mySurfels
Indexed surface elements.
Positions myGradientAlign
Internal members to store precomputed topological informations.
std::vector< SH3::Idx > myFairnessPointelsIdx
Indices of cells foor the Fairness term.
BOOST_CONCEPT_ASSERT((concepts::CDigitalSurfaceContainer< DigitalSurfaceContainer >))
double myAlpha
Data attachment term coefficient.
std::vector< Z3i::RealPoint > Positions
Pointels position container.
CountedPtr< DigSurface > myDigitalSurface
Input DigitalSurface to regularize.
bool myInit
Flag if the object has been set up properly.
void attachNormalVectors(const std::function< SHG3::RealVector(SH3::SCell &)> &normalFunc)
std::vector< unsigned char > myNumberAdjEdgesToPointel
Number of adjacent edges to pointels.
DigitalSurfaceRegularization(DigitalSurfaceRegularization &&other)=delete
ShortcutsGeometry< Z3i::KSpace > SHG3
We rely on the ShortcutsGeometry 3D types.
TDigitalSurface DigSurface
DigitalSurface type.
SH3::Cell2Index myPointelIndex
Indices for pointels.
Positions myGradient
Gradient of the energy w.r.t. vertex positons.
SHG3::RealPoint getRegularizedPosition(const SH3::Cell &aPointel)
void selfDisplay(std::ostream &out) const
double regularize(const unsigned int nbIters=200, const double dt=1.0, const double epsilon=0.0001)
Main regularization loop.
void init(ConstAlias< std::vector< double > > alphas, ConstAlias< std::vector< double > > betas, ConstAlias< std::vector< double > > gammas)
Initialize the parameters of the energy function.
const std::vector< double > * myAlphas
Data attachment term local coefficients.
const SH3::Surfel2Index & getSurfelIndex() const
double regularize(const unsigned int nbIters, const double dt, const double epsilon, const AdvectionFunction &advectionFunc)
Main regularization loop.
SH3::PolygonalSurface::FaceRange myFaces
All faces of the dual digital surfacce.
DigitalSurfaceRegularization(CountedPtr< DigSurface > aDigSurf)
std::vector< Z3i::RealVector > Normals
Pointels position container.
const std::vector< double > * myGammas
Fairness attachment term local coefficients.
std::vector< unsigned char > myNbAdjacent
Number of adjacent faces to given vertex.
DigitalSurfaceRegularization(const DigitalSurfaceRegularization &other)=delete
DigitalSurfaceRegularization & operator=(const DigitalSurfaceRegularization &other)=delete
Shortcuts< Z3i::KSpace > SH3
We rely on the Shortcuts 3D types.
Aim: Implements basic operations that will be used in Point and Vector classes.
Aim: This class is used to simplify shape and surface creation. With it, you can create new shapes an...
static Parameters defaultParameters()
Aim: This class is used to simplify shape and surface creation. With it, you can create new shapes an...
Definition Shortcuts.h:105
TKSpace KSpace
Digital cellular space.
Definition Shortcuts.h:111
std::map< Cell, IdxVertex > Cell2Index
Definition Shortcuts.h:189
LightDigitalSurface::Cell Cell
Definition Shortcuts.h:162
static KSpace getKSpace(const Point &low, const Point &up, Parameters params=parametersKSpace())
Definition Shortcuts.h:332
std::map< Surfel, IdxSurfel > Surfel2Index
Definition Shortcuts.h:188
LightDigitalSurface::SCell SCell
Definition Shortcuts.h:163
SCellRange SurfelRange
Definition Shortcuts.h:176
static Parameters defaultParameters()
Definition Shortcuts.h:203
DGtal is the top-level namespace which contains all DGtal functions and types.
std::ostream & operator<<(std::ostream &out, const ClosedIntegerHalfPlane< TSpace > &object)
Aim: The digital surface container concept describes a minimal set of inner types and methods so as t...