34#include "DGtal/base/Common.h"
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"
42#include "DGtal/geometry/curves/FreemanChain.h"
45#include "DGtal/geometry/curves/BinomialConvolver.h"
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"
111computeCurvatureBCC(
double h,
const FreemanChain<Z2i::Integer> &fc, std::vector<double> &resCurvature,
113 std::vector<Z2i::Point> vectPoints;
114 FreemanChain<Z2i::Integer>::getContourPoints( fc, vectPoints );
116 typedef BinomialConvolver<std::vector<Z2i::Point>::const_iterator,
double> MyBinomialConvolver;
117 typedef CurvatureFromBinomialConvolverFunctor< MyBinomialConvolver, double > CurvatureBCFct;
118 BinomialConvolverEstimator< MyBinomialConvolver, CurvatureBCFct> BCCurvatureEstimator;
119 BCCurvatureEstimator.init( h, vectPoints.begin(), vectPoints.end(), isClosed );
120 resCurvature.clear();
121 resCurvature.resize(vectPoints.size());
122 BCCurvatureEstimator.eval( vectPoints.begin(), vectPoints.end(), resCurvature.begin() );
129int main(
int argc,
char** argv )
134 std::string fileName;
135 std::string outputFileName;
136 double h_initial {1.0};
137 double h_increment {1.0};
138 double h_final {1.0};
139 double curvatureCutOff {10};
141 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");
142 app.add_option(
"-i,--input,1",fileName,
"Input FreemanChain file name")->required()->check(CLI::ExistingFile);
143 app.add_option(
"-o,--output,2",outputFileName,
"Set the output name")->required();
144 app.add_option(
"--gridStepInit", h_initial,
"Grid step initial");
145 app.add_option(
"--gridStepIncrement", h_increment,
"Grid step increment ");
146 app.add_option(
"--gridStepFinal", h_final,
"Grid step final");
147 app.add_option(
"--curvatureCutOff,-c", curvatureCutOff,
"set the curvature limits to better display");
149 app.get_formatter()->column_width(40);
150 CLI11_PARSE(app, argc, argv);
153 typedef ImageContainerBySTLVector<Z2i::Domain, double > Image2D;
156 std::vector< DGtal::FreemanChain<Z2i::Integer> > vectFcs = PointListReader< Z2i::Point >:: getFreemanChainsFromFile<Z2i::Integer> (fileName);
157 bool isClosed = vectFcs.at(0).isClosed();
161 unsigned int height = (int)((h_final-h_initial)/h_increment);
163 Z2i::Domain domain (Z2i::Point(0,0), Z2i::Point(vectFcs.at(0).size()+(isClosed? 0: 1), height-1));
164 Image2D cssImage(domain);
165 HueShadeColorMap<double> gradCurvature (-curvatureCutOff, curvatureCutOff);
167 trace.progressBar(0, height);
169 for(
double l= 0; l < height; l++ ){
171 trace.progressBar(l, height);
172 std::vector<double> curvaturesBCC;
173 computeCurvatureBCC(h, vectFcs.at(0), curvaturesBCC, isClosed);
176 for ( std::vector<double>::const_iterator it = curvaturesBCC.begin(), it_end = curvaturesBCC.end();
177 it != it_end; ++it, ++j ) {
179 c = c<-curvatureCutOff? -curvatureCutOff: c;
180 c = c>curvatureCutOff? curvatureCutOff: c;
181 cssImage.setValue(Z2i::Point(j, l), c);
185 trace.progressBar(height, height);
186 trace.info() <<std::endl;
187 DGtal::GenericWriter<Image2D, 2, DGtal::Color, HueShadeColorMap<double> >::exportFile(outputFileName, cssImage, gradCurvature );