DGtal  1.1.0
toricdomainvolumetric.cpp
Go to the documentation of this file.
1 
42 #include <iostream>
44 #include <iomanip>
45 #include "DGtal/base/Common.h"
46 #include "DGtal/helpers/StdDefs.h"
47 #include "DGtal/io/colormaps/GrayscaleColorMap.h"
48 #include "DGtal/io/colormaps/HueShadeColorMap.h"
49 #include "DGtal/io/colormaps/TickedColorMap.h"
50 #include "DGtal/io/colormaps/GradientColorMap.h"
51 #include "DGtal/io/boards/Board2D.h"
52 #include "DGtal/images/ImageSelector.h"
53 #include "DGtal/images/SimpleThresholdForegroundPredicate.h"
54 #include "DGtal/geometry/volumes/distance/DistanceTransformation.h"
55 
56 #include <boost/algorithm/minmax_element.hpp>
58 
59 
61 int main()
62 {
63 
65  using namespace std;
66  using namespace DGtal;
67  using namespace Z2i;
68 
69  Point a ( 0, 0 );
70  Point b ( 32, 16);
71 
72  //Input image with unsigned char values
74  Image image ( Domain(a, b ));
75 
76  //We fill the image with the 128 value
77  for ( Image::Iterator it = image.begin(), itend = image.end();it != itend; ++it)
78  (*it)=128;
79 
80  //We add 3 seeds with 0 values.
81  image.setValue(Point(16,2), 0);
82  image.setValue(Point(2,11), 0);
83  image.setValue(Point(30,15), 0);
85 
86  trace.beginBlock ( "Example toricdomainvolumetric" );
87  //Input shape output
89  Board2D board;
91  Display2DFactory::drawImage<Gray>(board, image, (unsigned int)0, (unsigned int)129);
92  board.saveSVG("toric-inputShape.svg");
93 
95  //Point Predicate from random seed image
97  PointPredicate predicate(image,0);
99 
103 
104  //Regular 2D domain
105  DTL2 dtL2(image.domain(), predicate, l2Metric);
106  //Full toric 2D domain
107  DTL2Toric dtL2Toric(image.domain(), predicate, l2Metric, {{true, true}} );
109 
113 
114  // 2D domain that is periodic along the first dimension.
115  DTL2ToricX dtL2ToricX( image.domain(), predicate, l2Metric, {{true, false}} );
116  // 2D domain that is periodic along the second dimension.
117  DTL2ToricY dtL2ToricY( image.domain(), predicate, l2Metric, {{false, true}} );
119 
120  //We compute the maximum DT value on the L2 map
121  const DTL2::Value maxv2 = * (boost::first_max_element(dtL2.constRange().begin(), dtL2.constRange().end()));
122  const DTL2Toric::Value maxvtoric = * (boost::first_max_element(dtL2Toric.constRange().begin(), dtL2Toric.constRange().end()));
123  const DTL2ToricX::Value maxvtoricX = * (boost::first_max_element(dtL2ToricX.constRange().begin(), dtL2ToricX.constRange().end()));
124  const DTL2ToricY::Value maxvtoricY = * (boost::first_max_element(dtL2ToricY.constRange().begin(), dtL2ToricY.constRange().end()));
125 
126  // Color map based on the maximal value for all maps (in order to compare results with similar colors).
127  const auto maxvall = std::max( { maxv2, maxvtoric, maxvtoricX, maxvtoricY } );
128 
130  //Colormap used for the SVG output
131  typedef HueShadeColorMap<DTL2::Value, 1> HueTwice;
133 
134  trace.warning() << "DT maxValue= " << maxv2 << endl;
135  board.clear();
136  Display2DFactory::drawImage<HueTwice>(board, dtL2, 0.0, maxvall + 1);
137  board.saveSVG ( "toric-example-DT-L2.svg" );
138 
139  trace.warning() << "Full toric maxValue= " << maxvtoric << endl;
140  board.clear();
141  Display2DFactory::drawImage<HueTwice>(board, dtL2Toric, 0.0, maxvall + 1);
142  board.saveSVG ( "toric-example-DT-L2-toric.svg" );
143 
144  trace.warning() << "1th dimension periodic maxValue= " << maxvtoricX << endl;
145  board.clear();
146  Display2DFactory::drawImage<HueTwice>(board, dtL2ToricX, 0.0, maxvall + 1);
147  board.saveSVG ( "toric-example-DT-L2-toricX.svg" );
148 
149  trace.warning() << "2nd dimension periodic maxValue= " << maxvtoricY << endl;
150  board.clear();
151  Display2DFactory::drawImage<HueTwice>(board, dtL2ToricY, 0.0, maxvall + 1);
152  board.saveSVG ( "toric-example-DT-L2-toricY.svg" );
153 
154  //Explicit export with ticked colormap
155  //We compute the maximum DT value on the L2 map
156  TickedColorMap<double, GradientColorMap<double> > ticked(0.0,maxv2, Color::White);
157  ticked.addRegularTicks(3, 0.5);
158  ticked.finalize();
159  ticked.colormap()->addColor( Color::Red );
160  ticked.colormap()->addColor( Color::Black );
161  board.clear();
162  for ( auto it = dtL2.domain().begin(), itend = dtL2.domain().end();it != itend; ++it)
163  {
164  board<< CustomStyle((*it).className(),new CustomColors(ticked(dtL2(*it)),ticked(dtL2(*it))));
165  board << *it;
166  }
167  board.saveSVG("toric-example-DT-L2-ticked.svg");
168 
169  board.clear();
170  for ( auto it = dtL2Toric.domain().begin(), itend = dtL2Toric.domain().end();it != itend; ++it)
171  {
172  board<< CustomStyle((*it).className(),new CustomColors(ticked(dtL2Toric(*it)),ticked(dtL2Toric(*it))));
173  board << *it;
174  }
175  board.saveSVG("toric-example-DT-L2-ticked-toric.svg");
176 
177  board.clear();
178  for ( auto it = dtL2ToricX.domain().begin(), itend = dtL2ToricX.domain().end();it != itend; ++it)
179  {
180  board<< CustomStyle((*it).className(),new CustomColors(ticked(dtL2ToricX(*it)),ticked(dtL2ToricX(*it))));
181  board << *it;
182  }
183  board.saveSVG("toric-example-DT-L2-ticked-toricX.svg");
184 
185  board.clear();
186  for ( auto it = dtL2ToricY.domain().begin(), itend = dtL2ToricY.domain().end();it != itend; ++it)
187  {
188  board<< CustomStyle((*it).className(),new CustomColors(ticked(dtL2ToricY(*it)),ticked(dtL2ToricY(*it))));
189  board << *it;
190  }
191  board.saveSVG("toric-example-DT-L2-ticked-toricY.svg");
192 
193  //Voronoi vector output
194  board.clear();
195  board << dtL2.domain();
196  for ( auto it = dtL2.domain().begin(), itend = dtL2.domain().end();it != itend; ++it)
197  if ( dtL2.getVoronoiVector(*it) != *it )
198  Display2DFactory::draw(board,dtL2.getVoronoiVector(*it) - (*it), (*it));
199  board.saveSVG("toric-example-Voro-L2.svg");
200 
201  board.clear();
202  board << dtL2Toric.domain();
203  for ( auto it = dtL2Toric.domain().begin(), itend = dtL2Toric.domain().end();it != itend; ++it)
204  if ( dtL2Toric.getVoronoiVector(*it) != *it )
205  Display2DFactory::draw(board, dtL2Toric.getVoronoiVector(*it) - (*it), (*it));
206  board.saveSVG("toric-example-Voro-L2-toric.svg");
207 
208  board.clear();
209  board << dtL2Toric.domain();
210  for ( auto it = dtL2Toric.domain().begin(), itend = dtL2Toric.domain().end();it != itend; ++it)
211  if ( dtL2Toric.getVoronoiVector(*it) != *it )
212  Display2DFactory::draw(board, dtL2Toric.projectPoint(dtL2Toric.getVoronoiVector(*it)) - (*it), (*it));
213  board.saveSVG("toric-example-Voro-L2-toric-projected.svg");
214 
215  board.clear();
216  board << dtL2ToricX.domain();
217  for ( auto it = dtL2ToricX.domain().begin(), itend = dtL2ToricX.domain().end();it != itend; ++it)
218  if ( dtL2ToricX.getVoronoiVector(*it) != *it )
219  Display2DFactory::draw(board, dtL2ToricX.getVoronoiVector(*it) - (*it), (*it));
220  board.saveSVG("toric-example-Voro-L2-toricX.svg");
221 
222  board.clear();
223  board << dtL2ToricY.domain();
224  for ( auto it = dtL2ToricY.domain().begin(), itend = dtL2ToricY.domain().end();it != itend; ++it)
225  if ( dtL2ToricY.getVoronoiVector(*it) != *it )
226  Display2DFactory::draw(board, dtL2ToricY.getVoronoiVector(*it) - (*it), (*it));
227  board.saveSVG("toric-example-Voro-L2-toricY.svg");
228 
229  trace.endBlock();
230  return 0;
231 }
232 // //
LibBoard::Board::setUnit
void setUnit(Unit unit)
Definition: Board.cpp:240
DGtal::GrayscaleColorMap
Aim: This class template may be used to (linearly) convert scalar values in a given range into gray l...
Definition: GrayscaleColorMap.h:94
image
Image image(domain)
DGtal::Trace::endBlock
double endBlock()
max
int max(int a, int b)
Definition: testArithmeticalDSS.cpp:1108
DGtal::ImageContainerBySTLVector
Definition: ImageContainerBySTLVector.h:127
LibBoard::Board::UCentimeter
@ UCentimeter
Definition: Board.h:43
DGtal::TickedColorMap
Aim: This class adapts any colormap to add "ticks" in the colormap colors.
Definition: TickedColorMap.h:79
DGtal::HueShadeColorMap
Aim: This class template may be used to (linearly) convert scalar values in a given range into a colo...
Definition: HueShadeColorMap.h:91
DGtal::trace
Trace trace
Definition: Common.h:150
DGtal::Trace::beginBlock
void beginBlock(const std::string &keyword="")
DGtal::CustomStyle
Definition: Board2D.h:217
main
int main()
Definition: toricdomainvolumetric.cpp:61
Image
ImageContainerBySTLVector< Domain, Value > Image
Definition: testSimpleRandomAccessRangeFromPoint.cpp:45
draw
void draw(const Iterator &itb, const Iterator &ite, Board &aBoard)
Definition: testSegmentation.cpp:75
DGtal
DGtal is the top-level namespace which contains all DGtal functions and types.
Definition: ClosedIntegerHalfPlane.h:49
Domain
HyperRectDomain< Space > Domain
Definition: testSimpleRandomAccessRangeFromPoint.cpp:44
DGtal::CustomColors
Custom style class redefining the pen color and the fill color. You may use Board2D::Color::None for ...
Definition: Board2D.h:279
DGtal::ImageContainerBySTLVector< Domain, Value >::Iterator
std::vector< Value >::iterator Iterator
Definition: ImageContainerBySTLVector.h:262
LibBoard::Board::saveSVG
void saveSVG(const char *filename, PageSize size=Board::BoundingBox, double margin=10.0) const
Definition: Board.cpp:1012
DGtal::Board2D
Aim: This class specializes a 'Board' class so as to display DGtal objects more naturally (with <<)....
Definition: Board2D.h:71
DGtal::Image
Aim: implements association bewteen points lying in a digital domain and values.
Definition: Image.h:70
DGtal::DistanceTransformation
Aim: Implementation of the linear in time distance transformation for separable metrics.
Definition: DistanceTransformation.h:100
DGtal::Trace::warning
std::ostream & warning()
Point
MyPointD Point
Definition: testClone2.cpp:383
Value
double Value
Definition: testSimpleRandomAccessRangeFromPoint.cpp:38
DGtal::functors::SimpleThresholdForegroundPredicate
Aim: Define a simple Foreground predicate thresholding image values given a single thresold....
Definition: SimpleThresholdForegroundPredicate.h:66