This example shows the computation of the VCM of a digital surface read from a .vol file. The normal is estimated from the diagonalization of the VCM tensor, while the orientation is deduced from the orientation of the trivial surfel normals. Feature detection is achieved with the eigenvalues of the VCM. A red color indicates a feature. Normals are displayed as black lines.
#include <iostream>
#include "DGtal/base/Common.h"
#include "DGtal/helpers/StdDefs.h"
#include "DGtal/kernel/BasicPointPredicates.h"
#include "DGtal/math/linalg/EigenDecomposition.h"
#include "DGtal/topology/helpers/Surfaces.h"
#include "DGtal/topology/DigitalSurface.h"
#include "DGtal/topology/ImplicitDigitalSurface.h"
#include "DGtal/images/ImageSelector.h"
#include "DGtal/images/IntervalForegroundPredicate.h"
#include "DGtal/geometry/volumes/distance/ExactPredicateLpSeparableMetric.h"
#include "DGtal/geometry/surfaces/estimation/VoronoiCovarianceMeasureOnDigitalSurface.h"
#include "DGtal/io/colormaps/GradientColorMap.h"
#include "DGtal/io/viewers/Viewer3D.h"
#include "DGtal/io/readers/GenericReader.h"
#include "ConfigExamples.h"
int main(
int argc,
char** argv )
{
QApplication application(argc,argv);
typedef KSpace::Surfel
Surfel;
typedef KSpace::Cell
Cell;
KernelFunction > VCMOnSurface;
typedef VCMOnSurface::Surfel2Normals::const_iterator S2NConstIterator;
string inputFilename = examplesPath + "samples/Al.100.vol";
trace.
info() <<
"File = " << inputFilename << std::endl;
int thresholdMin = 0;
trace.
info() <<
"Min image thres. = " << thresholdMin << std::endl;
int thresholdMax = 1;
trace.
info() <<
"Max image thres. = " << thresholdMax << std::endl;
const double R = 20;
trace.
info() <<
"Big radius R = " << R << std::endl;
const double r = 3;
trace.
info() <<
"Small radius r = " << r << std::endl;
const double trivial_r = 3;
trace.
info() <<
"Trivial radius t = " << trivial_r << std::endl;
const double T = 0.1;
trace.
info() <<
"Feature thres. T = " << T << std::endl;
const double size = 1.0;
trace.
beginBlock(
"Loading image into memory and build digital surface." );
ThresholdedImage thresholdedImage( image, thresholdMin, thresholdMax );
trace.
beginBlock(
"Extracting boundary by scanning the space. " );
ks.init( image.domain().lowerBound(),
image.domain().upperBound(), true );
DigitalSurfaceContainer* container =
new DigitalSurfaceContainer( ks, thresholdedImage, surfAdj, bel, false );
trace.
info() <<
"Digital surface has " << surface.size() <<
" surfels." << std::endl;
Metric l2;
KernelFunction chi( 1.0, r );
VCMOnSurface vcm_surface( surface, embType, R, r,
chi, trivial_r, l2, true );
viewer.setWindowTitle("3D VCM viewer");
viewer <<
SetMode3D( dummy.className(),
"Basic" );
RealVector lambda;
for ( S2NConstIterator it = vcm_surface.mapSurfel2Normals().begin(),
itE = vcm_surface.mapSurfel2Normals().end(); it != itE; ++it )
{
Point kp = ks.sKCoords( s );
RealPoint rp( 0.5 * (
double) kp[ 0 ], 0.5 * (
double) kp[ 1 ], 0.5 * (
double) kp[ 2 ] );
RealVector n = it->second.vcmNormal;
vcm_surface.getChiVCMEigenvalues( lambda, s );
double ratio = lambda[ 1 ] / ( lambda[ 0 ] + lambda[ 1 ] + lambda[ 2 ] );
viewer << ks.unsigns( s );
n *= size;
viewer.
addLine( rp + n, rp - n, 0.1 );
}
viewer << Viewer3D<>::updateDisplay;
application.exec();
return 0;
}
Structure representing an RGB triple with alpha component.
Aim: Represents a set of n-1-cells in a nD space, together with adjacency relation between these cell...
virtual void setLineColor(DGtal::Color aColor)
virtual void setFillColor(DGtal::Color aColor)
void addLine(const RealPoint &p1, const RealPoint &p2, const double width=0.03)
Aim: implements separable l_p metrics with exact predicates.
Aim: This class template may be used to (linearly) convert scalar values in a given range into a colo...
void addColor(const Color &color)
Aim: Parallelepidec region of a digital space, model of a 'CDomain'.
Aim: A model of CDigitalSurfaceContainer which defines the digital surface as the boundary of an impl...
Aim: This class is a model of CCellularGridSpaceND. It represents the cubical grid as a cell complex,...
Aim: A utility class for constructing surfaces (i.e. set of (n-1)-cells).
Aim: Represent adjacencies between surfel elements, telling if it follows an interior to exterior ord...
void beginBlock(const std::string &keyword="")
virtual void show()
Overload QWidget method in order to add a call to updateList() method (to ensure that the lists are w...
Aim: This class specializes the Voronoi covariance measure for digital surfaces. It adds notably the ...
Aim: Define a simple Foreground predicate thresholding image values between two constant values (the ...
DGtal is the top-level namespace which contains all DGtal functions and types.
Surfel2PointEmbedding
Possible embeddings for surfel as point(s)
Aim: Provide a mechanism to load with the bestloader according to an image (2D or 3D) filename (by pa...
Modifier class in a Display3D stream. Useful to choose your own mode for a given class....
ImageContainerBySTLVector< Domain, Value > Image
HyperRectDomain< Space > Domain