DGtal 1.4.0
Loading...
Searching...
No Matches
distancetransform2D.cpp File Reference
#include <iostream>
#include <iomanip>
#include "DGtal/base/Common.h"
#include "DGtal/helpers/StdDefs.h"
#include "DGtal/io/colormaps/GrayscaleColorMap.h"
#include "DGtal/io/colormaps/HueShadeColorMap.h"
#include "DGtal/io/colormaps/TickedColorMap.h"
#include "DGtal/io/colormaps/GradientColorMap.h"
#include "DGtal/io/boards/Board2D.h"
#include "DGtal/images/ImageSelector.h"
#include "DGtal/images/SimpleThresholdForegroundPredicate.h"
#include "DGtal/geometry/volumes/distance/DistanceTransformation.h"
Include dependency graph for distancetransform2D.cpp:

Go to the source code of this file.

Functions

template<typename Image >
void randomSeeds (Image &image, const unsigned int nb, const int value)
 
int main ()
 

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
David Coeurjolly (david.nosp@m..coe.nosp@m.urjol.nosp@m.ly@l.nosp@m.iris..nosp@m.cnrs.nosp@m..fr ) Laboratoire d'InfoRmatique en Image et Systèmes d'information - LIRIS (CNRS, UMR 5205), CNRS, France
Date
2010/11/28

An example file named distancetransform2D. The aim of this example is to demonstrate the distance transformation package of the DGtal library. Using a simple random seed example, we compute the distance transformation (linear in time algorithm) using the L1, Linfinity and L2 metrics.

This file is part of the DGtal library.

Definition in file distancetransform2D.cpp.

Function Documentation

◆ main()

int main ( void )

[DTDef]

[DTDef]

[DTPredicate]

[DTPredicate]

[DTCompute]

[DTCompute]

[DTColormaps]

[DTColormaps]

Definition at line 88 of file distancetransform2D.cpp.

89{
90 trace.beginBlock ( "Example distancetransform2D" );
91
93 Z2i::Point a ( 0, 0 );
94 Z2i::Point b ( 127, 127);
95
96 //Input image with unsigned char values
98 Image image ( Z2i::Domain(a, b ));
99
100 //We fill the image with the 128 value
101 for ( Image::Iterator it = image.begin(), itend = image.end();it != itend; ++it)
102 (*it)=128;
103 //We generate 16 seeds with 0 values.
104 randomSeeds(image,16,0);
106
107 //Input shape output
109 Board2D board;
111 Display2DFactory::drawImage<Gray>(board, image, (unsigned int)0, (unsigned int)129);
112 board.saveSVG("inputShape.svg");
113
115 //Point Predicate from random seed image
117 PointPredicate predicate(image,0);
119
123
124
125 DTL2 dtL2(image.domain(), predicate, Z2i::l2Metric);
126 DTL1 dtL1(image.domain(), predicate, Z2i::l1Metric);
128
129
130 DTL2::Value maxv2=0;
131 //We compute the maximum DT value on the L2 map
132 for ( DTL2::ConstRange::ConstIterator it = dtL2.constRange().begin(), itend = dtL2.constRange().end();it != itend; ++it)
133 if ( (*it) > maxv2) maxv2 = (*it);
134
135 DTL1::Value maxv1=0;
136 //We compute the maximum DT value on the L1 map
137 for ( DTL1::ConstRange::ConstIterator it = dtL1.constRange().begin(), itend = dtL1.constRange().end();it != itend; ++it)
138 if ( (*it) > maxv1) maxv1 = (*it);
139
141 //Colormap used for the SVG output
142 typedef HueShadeColorMap<DTL2::Value, 2> HueTwice;
144
145
146
147
148 trace.warning() << dtL2 << " maxValue= "<<maxv2<< endl;
149 board.clear();
150 Display2DFactory::drawImage<HueTwice>(board, dtL2, 0.0, maxv2 + 1);
151 board.saveSVG ( "example-DT-L2.svg" );
152
153 trace.warning() << dtL1 << " maxValue= "<<maxv1<< endl;
154 board.clear();
155 Display2DFactory::drawImage<HueTwice>(board, dtL1, 0.0, maxv1 + 1);
156 board.saveSVG ( "example-DT-L1.svg" );
157
158 //Explicit export with ticked colormap
159 //We compute the maximum DT value on the L2 map
160 board.clear();
162 ticked.addRegularTicks(5, 0.5);
163 ticked.finalize();
164 ticked.colormap()->addColor( Color::Red );
165 ticked.colormap()->addColor( Color::Black );
166 for ( DTL2::Domain::ConstIterator it = dtL2.domain().begin(), itend = dtL2.domain().end();it != itend; ++it)
167 {
168 board<< CustomStyle((*it).className(),new CustomColors(ticked(dtL2(*it)),ticked(dtL2(*it))));
169 board << *it;
170 }
171 board.saveSVG("example-DT-L2-ticked.svg");
172
173 trace.endBlock();
174 return 0;
175}
Aim: This class specializes a 'Board' class so as to display DGtal objects more naturally (with <<)....
Definition Board2D.h:71
static const Color Red
Definition Color.h:416
static const Color White
Definition Color.h:415
static const Color Black
Definition Color.h:413
Aim: Implementation of the linear in time distance transformation for separable metrics.
Aim: This class template may be used to (linearly) convert scalar values in a given range into gray l...
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
Aim: This class adapts any colormap to add "ticks" in the colormap colors.
void beginBlock(const std::string &keyword="")
std::ostream & warning()
double endBlock()
Aim: Define a simple Foreground predicate thresholding image values given a single thresold....
void clear(const DGtal::Color &color=DGtal::Color::None)
Definition Board.cpp:151
void saveSVG(const char *filename, PageSize size=Board::BoundingBox, double margin=10.0) const
Definition Board.cpp:1011
void setUnit(Unit unit)
Definition Board.cpp:239
void randomSeeds(Image &image, const unsigned int nb, const int value)
static const L1Metric l1Metric
Definition StdDefs.h:124
static const L2Metric l2Metric
Definition StdDefs.h:123
Trace trace
Definition Common.h:153
Custom style class redefining the pen color and the fill color. You may use Board2D::Color::None for ...
Definition Board2D.h:279
static void drawImage(DGtal::Board2D &board, const Image &i, const typename Image::Value &minV, const typename Image::Value &maxV)
ImageContainerBySTLVector< Domain, Value > Image

References DGtal::TickedColorMap< TValue, TColorMap >::addRegularTicks(), DGtal::Trace::beginBlock(), DGtal::Color::Black, LibBoard::Board::clear(), DGtal::TickedColorMap< TValue, TColorMap >::colormap(), DGtal::Display2DFactory::drawImage(), DGtal::Trace::endBlock(), DGtal::TickedColorMap< TValue, TColorMap >::finalize(), DGtal::Z2i::l1Metric, DGtal::Z2i::l2Metric, randomSeeds(), DGtal::Color::Red, LibBoard::Board::saveSVG(), LibBoard::Board::setUnit(), DGtal::trace, LibBoard::Board::UCentimeter, DGtal::Trace::warning(), and DGtal::Color::White.

◆ randomSeeds()

template<typename Image >
void randomSeeds ( Image & image,
const unsigned int nb,
const int value )

Set to a given value a random set of nb points.

Parameters
imagethe image
nbthe number of random points to insert
valuethe value to add at each random point

Definition at line 72 of file distancetransform2D.cpp.

73{
74 typename Image::Point p, low = image.domain().lowerBound();
75 typename Image::Vector ext;
76
77 ext = image.extent();
78
79 for (unsigned int k = 0 ; k < nb; k++)
80 {
81 for (unsigned int dim = 0; dim < Image::dimension; dim++)
82 p[dim] = rand() % (ext[dim]) + low[dim];
83
84 image.setValue(p, value);
85 }
86}

References dim.

Referenced by main().