DGtalTools  1.5.beta
curvatureScaleSpaceBCC.cpp
1 
32 #include <iostream>
33 
34 #include "DGtal/base/Common.h"
35 
36 #include "DGtal/shapes/ShapeFactory.h"
37 #include "DGtal/shapes/Shapes.h"
38 #include "DGtal/helpers/StdDefs.h"
39 #include "DGtal/topology/helpers/Surfaces.h"
40 
41 //Grid curve
42 #include "DGtal/geometry/curves/FreemanChain.h"
43 
44 //Estimators
45 #include "DGtal/geometry/curves/BinomialConvolver.h"
46 
47 
48 // Generation of resulting image
49 #include "DGtal/images/ImageContainerBySTLVector.h"
50 #include "DGtal/io/writers/GenericWriter.h"
51 #include "DGtal/io/colormaps/GradientColorMap.h"
52 #include "DGtal/io/writers/PPMWriter.h"
53 
54 #include "CLI11.hpp"
55 
56 #include <vector>
57 #include <string>
58 #include <iomanip>
59 
60 
61 using namespace DGtal;
62 
63 
64 
108 void
109 computeCurvatureBCC(double h, const FreemanChain<Z2i::Integer> &fc, std::vector<double> &resCurvature,
110  bool isClosed){
111  std::vector<Z2i::Point> vectPoints;
113 
114  typedef BinomialConvolver<std::vector<Z2i::Point>::const_iterator, double> MyBinomialConvolver;
117  BCCurvatureEstimator.init( h, vectPoints.begin(), vectPoints.end(), isClosed );
118  resCurvature.clear();
119  resCurvature.resize(vectPoints.size());
120  BCCurvatureEstimator.eval( vectPoints.begin(), vectPoints.end(), resCurvature.begin() );
121 }
122 
123 
124 
126 
127 int main( int argc, char** argv )
128 {
129 
130  // parse command line CLI ----------------------------------------------
131  CLI::App app;
132  std::string fileName;
133  std::string outputFileName;
134  double h_initial {1.0};
135  double h_increment {1.0};
136  double h_final {1.0};
137  double curvatureCutOff {10};
138 
139  app.description("Generate the Curvature Scale Space image using a binomial convolver based estimator.\n Typical use example:\n \t curvatureScaleSpaceBCC <input filename> <output filename>\n");
140  app.add_option("-i,--input,1",fileName,"Input FreemanChain file name")->required()->check(CLI::ExistingFile);
141  app.add_option("-o,--output,2",outputFileName,"Set the output name")->required();
142  app.add_option("--gridStepInit", h_initial, "Grid step initial", true);
143  app.add_option("--gridStepIncrement", h_increment, "Grid step increment ",true);
144  app.add_option("--gridStepFinal", h_final, "Grid step final", true);
145  app.add_option("--curvatureCutOff,-c", curvatureCutOff, "set the curvature limits to better display", true);
146 
147  app.get_formatter()->column_width(40);
148  CLI11_PARSE(app, argc, argv);
149  // END parse command line using CLI ----------------------------------------------
150 
152 
153 
154  std::vector< DGtal::FreemanChain<Z2i::Integer> > vectFcs = PointListReader< Z2i::Point >:: getFreemanChainsFromFile<Z2i::Integer> (fileName);
155  bool isClosed = vectFcs.at(0).isClosed();
156 
157 
158  // Preparing resulting image:
159  unsigned int height = (int)((h_final-h_initial)/h_increment);
160  // We add one point if the freemnchain is open.
161  Z2i::Domain domain (Z2i::Point(0,0), Z2i::Point(vectFcs.at(0).size()+(isClosed? 0: 1), height-1));
162  Image2D cssImage(domain);
163  HueShadeColorMap<double> gradCurvature (-curvatureCutOff, curvatureCutOff);
164 
165  trace.progressBar(0, height);
166  double h= h_initial;
167  for(double l= 0; l < height; l++ ){
168  // Binomial estimator
169  trace.progressBar(l, height);
170  std::vector<double> curvaturesBCC;
171  computeCurvatureBCC(h, vectFcs.at(0), curvaturesBCC, isClosed);
172  // Output
173  unsigned int j = 0;
174  for ( std::vector<double>::const_iterator it = curvaturesBCC.begin(), it_end = curvaturesBCC.end();
175  it != it_end; ++it, ++j ) {
176  double c = *it;
177  c = c<-curvatureCutOff? -curvatureCutOff: c;
178  c = c>curvatureCutOff? curvatureCutOff: c;
179  cssImage.setValue(Z2i::Point(j, l), c);
180  }
181  h=h+h_increment;
182  }
183  trace.progressBar(height, height);
184  trace.info() <<std::endl;
185  DGtal::GenericWriter<Image2D, 2, DGtal::Color, HueShadeColorMap<double> >::exportFile(outputFileName, cssImage, gradCurvature );
186  return 0;
187 }
188 
int main(int argc, char **argv)
void init(const double h, const ConstIterator &itb, const ConstIterator &ite, const bool isClosed=true)
Quantity eval(const ConstIterator &it)
static void getContourPoints(const FreemanChain &fc, std::vector< Point > &aVContour)
std::ostream & info()
void progressBar(const double currentValue, const double maximalValue)
Trace trace(traceWriterTerm)