DGtal 2.1.0
Loading...
Searching...
No Matches
volDistanceTraversal.cpp
Go to the documentation of this file.
1
33#include <iostream>
34#include <queue>
35
36#include "DGtal/base/BasicFunctors.h"
37#include "DGtal/topology/CanonicSCellEmbedder.h"
38#include "DGtal/helpers/StdDefs.h"
39#include "DGtal/graph/DistanceBreadthFirstVisitor.h"
40#include "DGtal/topology/DigitalSurface.h"
41#include "DGtal/topology/LightImplicitDigitalSurface.h"
42#include "DGtal/geometry/volumes/distance/LpMetric.h"
43#include "DGtal/io/readers/VolReader.h"
44#include "DGtal/io/viewers/PolyscopeViewer.h"
45
46#include "DGtal/io/Color.h"
47#include "DGtal/io/colormaps/HueShadeColorMap.h"
48#include "DGtal/images/ImageSelector.h"
49#include "DGtal/images/imagesSetsUtils/SetFromImage.h"
51
53
54using namespace std;
55using namespace DGtal;
56using namespace Z3i;
57
59
60void usage( int, char** argv ) {
61 std::cerr << "Usage: " << argv[ 0 ] << " <fileName.vol> <minT> <maxT> <idxP>" << std::endl;
62 std::cerr << "\t - displays the Euclidean distance to the specified surfel on the boundary of the shape stored in vol file <fileName.vol>." << std::endl;
63 std::cerr << "\t - the shape is defined implicitly: voxel v belongs to the shape iff its value I(v) follows minT < I(v) <= maxT." << std::endl;
64 std::cerr << "\t - starts from the <idxP>-th surfel or first one if invalid." << std::endl;
65}
66
67int main( int argc, char** argv )
68{
69 if ( argc < 4 )
70 {
71 usage( argc, argv );
72 return 1;
73 }
74 std::string inputFilename = argv[ 1 ];
75 unsigned int minThreshold = atoi( argv[ 2 ] );
76 unsigned int maxThreshold = atoi( argv[ 3 ] );
77 unsigned int idxP = (argc <= 4) ? 0 : atoi( argv[ 4 ] );
78
80 trace.beginBlock( "Reading vol file into an image." );
83 DigitalSet set3d (image.domain());
85 minThreshold, maxThreshold);
88
89
91 trace.beginBlock( "Construct the Khalimsky space from the image domain." );
92 KSpace ks;
93 bool space_ok = ks.init( image.domain().lowerBound(),
94 image.domain().upperBound(), true );
95 if (!space_ok)
96 {
97 trace.error() << "Error in the Khamisky space construction."<<std::endl;
98 return 2;
99 }
100 trace.endBlock();
102
104 typedef SurfelAdjacency<KSpace::dimension> MySurfelAdjacency;
105 MySurfelAdjacency surfAdj( true ); // interior in all directions.
107
109 trace.beginBlock( "Set up digital surface." );
113 SCell bel = Surfaces<KSpace>::findABel( ks, set3d, 100000 );
114 MyDigitalSurfaceContainer* ptrSurfContainer =
115 new MyDigitalSurfaceContainer( ks, set3d, surfAdj, bel );
116 MyDigitalSurface digSurf( ptrSurfContainer ); // acquired
117 trace.endBlock();
118 // Find first bel.
120 for ( idxP = idxP % digSurf.size(); idxP != 0; --idxP ) ++it;
121 bel = *it;
123
125 trace.beginBlock( "Extracting boundary by distance tracking from an initial bel." );
126 typedef CanonicSCellEmbedder<KSpace> SCellEmbedder;
127 typedef SCellEmbedder::Value RealPoint;
128 typedef RealPoint::Coordinate Scalar;
129 typedef LpMetric<Space> Distance;
130 using DistanceToPoint = std::function<double(const Space::RealPoint &)>;
133 MyDistanceVisitor;
134 typedef MyDistanceVisitor::Node MyNode;
135 typedef MyDistanceVisitor::Scalar MySize;
136
137 SCellEmbedder embedder( ks );
138 Distance distance(2.0);
139 DistanceToPoint distanceToPoint = std::bind( distance, embedder( bel ), std::placeholders::_1 );
140 VertexFunctor vfunctor( embedder, distanceToPoint );
141 MyDistanceVisitor visitor( digSurf, vfunctor, bel );
142
143 unsigned long nbSurfels = 0;
144 MyNode node;
145 while ( ! visitor.finished() )
146 {
147 node = visitor.current();
148 ++nbSurfels;
149 visitor.expand();
150 }
151 MySize maxDist = node.second;
152 trace.endBlock();
154
156 trace.beginBlock( "Displaying surface in PolyscopeViewer." );
157 PolyscopeViewer<> viewer( ks );
158 HueShadeColorMap<MySize,1> hueShade( 0, maxDist );
159 MyDistanceVisitor visitor2( digSurf, vfunctor, bel );
160 viewer << Color::White << bel;
161 visitor2.expand();
162 std::vector< MyDistanceVisitor::Node > layer;
163 while ( ! visitor2.finished() )
164 {
165 MyNode n = visitor2.current();
166 Color c = hueShade( n.second );
167 viewer << c << n.first;
168 visitor2.expand();
169 }
170 trace.info() << "nb surfels = " << nbSurfels << std::endl;
171 trace.endBlock();
172 viewer.show();
173 return 0;
175}
176
Structure representing an RGB triple with alpha component.
Definition Color.h:77
static const Color White
Definition Color.h:424
Aim: A wrapper class around a STL associative container for storing sets of digital points within som...
Aim: Represents a set of n-1-cells in a nD space, together with adjacency relation between these cell...
DigitalSurfaceContainer::SurfelConstIterator ConstIterator
ConstIterator begin() const
Aim: This class is useful to perform an exploration of a graph given a starting point or set (called ...
Aim: This class template may be used to (linearly) convert scalar values in a given range into a colo...
Aim: implements association bewteen points lying in a digital domain and values.
Definition Image.h:70
const Domain & domain() const
Definition Image.h:192
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.
Aim: A model of CDigitalSurfaceContainer which defines the digital surface as the boundary of an impl...
Aim: implements l_p metrics.
Definition LpMetric.h:75
Aim: Implements basic operations that will be used in Point and Vector classes.
Component Coordinate
Type for Point elements.
void show() override
Starts the event loop and display of elements.
static SCell findABel(const KSpace &K, const PointPredicate &pp, unsigned int nbtries=1000)
Aim: Represent adjacencies between surfel elements, telling if it follows an interior to exterior ord...
void beginBlock(const std::string &keyword="")
std::ostream & error()
std::ostream & info()
double endBlock()
Aim: Define a new Functor from the composition of two other functors.
DigitalSurface< MyDigitalSurfaceContainer > MyDigitalSurface
DigitalSetBoundary< KSpace, DigitalSet > MyDigitalSurfaceContainer
Space::RealPoint RealPoint
Definition StdDefs.h:170
DGtal is the top-level namespace which contains all DGtal functions and types.
Trace trace
STL namespace.
Aim: A trivial embedder for signed cell, which corresponds to the canonic injection of cell centroids...
ImageContainerBySTLVector< Domain, Value > Type
Aim: Define utilities to convert a digital set into an image.
Represents a signed cell in a cellular grid space by its Khalimsky coordinates and a boolean value.
static ImageContainer importVol(const std::string &filename, const Functor &aFunctor=Functor())
int main()
Definition testBits.cpp:56
Image image(domain)