iRoCS Toolbox  1.1.0
ATBCoupledBSplineModel.hh
Go to the documentation of this file.
1 /**************************************************************************
2  *
3  * Copyright (C) 2015 Thorsten Falk
4  *
5  * Image Analysis Lab, University of Freiburg, Germany
6  *
7  * This program is free software; you can redistribute it and/or modify
8  * it under the terms of the GNU General Public License as published by
9  * the Free Software Foundation; either version 3 of the License, or
10  * (at your option) any later version.
11  *
12  * This program is distributed in the hope that it will be useful,
13  * but WITHOUT ANY WARRANTY; without even the implied warranty of
14  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15  * GNU General Public License for more details.
16  *
17  * You should have received a copy of the GNU General Public License
18  * along with this program; if not, write to the Free Software Foundation,
19  * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
20  *
21  **************************************************************************/
22 
23 #ifndef ATBCOUPLEDBSPLINEMODEL_LEGACY_HH
24 #define ATBCOUPLEDBSPLINEMODEL_LEGACY_HH
25 
26 #ifdef HAVE_CONFIG_H
27 #include <config.hh>
28 #endif
29 
31 
32 #include "ATBPolyline.hh"
33 
34 // #define __SAVEINTERMEDIATERESULTS
35 
36 #include <fstream>
37 
38 namespace atb
39 {
40 
41  static bool const dataTermUsePerpendicularPointsOnly = false;
42  static bool const controlPointsUpdatePerpendicularToSpline = false;
43  static bool const normalizeGradient = true;
44  static bool const doLineSearch = false;
45 
46 // When the optimization stops, regrid the resulting spline to allow
47 // further refinement
48  static bool const regrid = true;
49 
50  static bool const weighCurvatureWithSplineLength = true;
51 
52  double tikhonovRegularizer(
53  double value, std::vector<double> const &parameters);
54 
55  double dTikhonovRegularizer(
56  double value, std::vector<double> const &parameters);
57 
59  double value, std::vector<double> const &parameters);
60 
62  double value, std::vector<double> const &parameters);
63 
65  double value, std::vector<double> const &parameters);
66 
68  double value, std::vector<double> const &parameters);
69 
71  double value, std::vector<double> const &parameters);
72 
74  double value, std::vector<double> const &parameters);
75 
76  template<int Dim>
78  {
79 
80  public:
81 
83 
85 
87 
89 
91 
93 
94  Polyline<Dim> const &axisPolyline() const;
95 
97 
98  BSpline<double> const &thickness() const;
99 
101 
102  void updateAxisPolyline();
103 
104  private:
105 
107  Polyline<Dim> _axisPolyline;
108  BSpline<double> _thickness;
109 
110  };
111 
112  struct Energy
113  {
114 
115  Energy(double kappa = 1.0, double lambda = 0.0, double mu = 0.0);
116 
117  Energy(Energy const &E);
118 
119  Energy &operator=(Energy const &E);
120 
121  double value() const;
122 
123  double data, curvature, thickness, kappa, lambda, mu;
124 
125  };
126 
128  std::ostream &operator<<(std::ostream &os, Energy const &E);
129 
130  /*-----------------------------------------------------------------------
131  * One tube only
132  *-----------------------------------------------------------------------*/
133 
135  template<int Dim>
137  std::vector< blitz::TinyVector<double,Dim> > const &points,
139  double kappa, double lambda, double mu,
140  double (&regularizer)(double, std::vector<double> const &) =
142  std::vector<double> const &regularizerParameters = std::vector<double>());
143 
145  template<int Dim>
148  std::vector< blitz::TinyVector<double,Dim> > const &dAxisControlPoints,
149  std::vector<double> const &dThicknessControlPoints, double tau);
150 
152  template<int Dim>
154  std::vector< blitz::TinyVector<double,Dim> > const &points,
156  std::vector< blitz::TinyVector<double,Dim> > const &dAxisControlPoints,
157  std::vector<double> const &dThicknessControlPoints,
158  double tau, double kappa, double lambda, double mu,
159  double (&regularizer)(double, std::vector<double> const &),
160  std::vector<double> const &regularizerParameters);
161 
163  template<int Dim>
165  std::vector< blitz::TinyVector<double,Dim> > const &points,
167  double kappa, double lambda, double mu, int nIter, double tau,
168  double (&regularizer)(double, std::vector<double> const &) =
170  double (&dRegularizer)(double, std::vector<double> const &) =
172  std::vector<double> const &regularizerParameters = std::vector<double>(),
173  iRoCS::ProgressReporter *pr = NULL,
174  std::string const &evolutionFileName = "",
175  std::string const &evolutionGroup = "");
176 
178  template<int Dim>
179  bool regridModel(CoupledBSplineModel<Dim> &model, double minSegmentLength);
180 
182  template<int Dim>
184  std::vector< blitz::TinyVector<double,Dim> > const &points,
186  double kappa, double lambda, double mu, int nIter, double tau,
187  double regridLength,
188  double (&regularizer)(double, std::vector<double> const &) =
190  double (&dRegularizer)(double, std::vector<double> const &) =
192  std::vector<double> const &regularizerParameters = std::vector<double>(),
193  iRoCS::ProgressReporter *pr = NULL,
194  std::string const &evolutionFileName = "");
195 
197  template<int Dim>
199  std::vector<blitz::TinyVector<double,Dim> > const &points,
200  CoupledBSplineModel<Dim> const &model,
201  CoupledBSplineModel<Dim> &extendedModel,
202  double length, size_t direction,
203  std::vector< blitz::TinyVector<double,3> > const &searchDirections,
204  bool rightEnd, double kappa, double lambda, double mu, size_t nIter,
205  double tau, double regridLength,
206  double (&regularizer)(double, std::vector<double> const &),
207  double (&dRegularizer)(double, std::vector<double> const &),
208  std::vector<double> const &regularizerParameters);
209 
210  /*-----------------------------------------------------------------------
211  * Same for multiple tubes
212  *-----------------------------------------------------------------------*/
213 
215  template<int Dim>
217  std::vector< blitz::TinyVector<double,Dim> > const &points,
218  std::vector< CoupledBSplineModel<Dim> > &model,
219  double kappa, double lambda, double mu,
220  double (&regularizer)(double, std::vector<double> const &) =
222  std::vector<double> const &regularizerParameters = std::vector<double>());
223 
225  template<int Dim>
227  std::vector< blitz::TinyVector<double,Dim> > const &points,
228  std::vector< CoupledBSplineModel<Dim> > model,
229  std::vector< std::vector< blitz::TinyVector<double,Dim> > >
230  const &dAxisControlPoints,
231  std::vector< std::vector<double> > const &dThicknessControlPoints,
232  double tau, double kappa, double lambda, double mu,
233  double (&regularizer)(double, std::vector<double> const &),
234  std::vector<double> const &regularizerParameters);
235 
237  template<int Dim>
239  std::vector< blitz::TinyVector<double,Dim> > const &points,
240  std::vector< CoupledBSplineModel<Dim> > &model,
241  double kappa, double lambda, double mu, int nIter, double tau,
242  double (&regularizer)(double, std::vector<double> const &) =
244  double (&dRegularizer)(double, std::vector<double> const &) =
246  std::vector<double> const &regularizerParameters = std::vector<double>());
247 
249  template<int Dim>
251  std::vector< blitz::TinyVector<double,Dim> > const &points,
252  std::vector< CoupledBSplineModel<Dim> > &model,
253  double kappa, double lambda, double mu, int nIter, double tau,
254  double regridLength,
255  double (&regularizer)(double, std::vector<double> const &) =
257  double (&dRegularizer)(double, std::vector<double> const &) =
259  std::vector<double> const &regularizerParameters = std::vector<double>());
260 
261 #ifdef __SAVEINTERMEDIATERESULTS
262  std::string __intermediateResultFileName;
263  std::string __intermediateBaseGroup;
264  std::string __outerIterGroup;
265 #endif
266 
267 }
268 
269 #include "ATBCoupledBSplineModel.icc"
270 
271 #endif
BSpline< blitz::TinyVector< double, Dim > > const & axis() const
The Polyline class provides a simple polyline representation of a BSpline for fast point to spline di...
Definition: ATBPolyline.hh:53
static bool const normalizeGradient
The BSpline class provides functions for fitting B-Splines to point clouds and evaluating them at arb...
Definition: ATBSpline.hh:68
CoupledBSplineModel< Dim > & operator=(CoupledBSplineModel< Dim > const &model)
Energy computeUpdatedCoupledSplineEnergy(std::vector< blitz::TinyVector< double, Dim > > const &points, CoupledBSplineModel< Dim > model, std::vector< blitz::TinyVector< double, Dim > > const &dAxisControlPoints, std::vector< double > const &dThicknessControlPoints, double tau, double kappa, double lambda, double mu, double(&regularizer)(double, std::vector< double > const &), std::vector< double > const &regularizerParameters)
static bool const weighCurvatureWithSplineLength
double dTikhonovRegularizer(double value, std::vector< double > const &parameters)
static bool const controlPointsUpdatePerpendicularToSpline
double dTikhonovCutoffRegularizer(double value, std::vector< double > const &parameters)
double totalVariationCutoffRegularizer(double value, std::vector< double > const &parameters)
std::ostream & operator<<(std::ostream &os, Energy const &E)
bool regridModel(CoupledBSplineModel< Dim > &model, double minSegmentLength)
BSpline< double > const & thickness() const
Energy fitCoupledSplines(std::vector< blitz::TinyVector< double, Dim > > const &points, CoupledBSplineModel< Dim > &model, double kappa, double lambda, double mu, int nIter, double tau, double regridLength, double(&regularizer)(double, std::vector< double > const &)=tikhonovRegularizer, double(&dRegularizer)(double, std::vector< double > const &)=dTikhonovRegularizer, std::vector< double > const &regularizerParameters=std::vector< double >(), iRoCS::ProgressReporter *pr=NULL, std::string const &evolutionFileName="")
Energy computeCoupledSplineEnergy(std::vector< blitz::TinyVector< double, Dim > > const &points, CoupledBSplineModel< Dim > &model, double kappa, double lambda, double mu, double(&regularizer)(double, std::vector< double > const &)=tikhonovRegularizer, std::vector< double > const &regularizerParameters=std::vector< double >())
Energy extendCoupledBSplineModel(std::vector< blitz::TinyVector< double, Dim > > const &points, CoupledBSplineModel< Dim > const &model, CoupledBSplineModel< Dim > &extendedModel, double length, size_t direction, std::vector< blitz::TinyVector< double, 3 > > const &searchDirections, bool rightEnd, double kappa, double lambda, double mu, size_t nIter, double tau, double regridLength, double(&regularizer)(double, std::vector< double > const &), double(&dRegularizer)(double, std::vector< double > const &), std::vector< double > const &regularizerParameters)
static bool const regrid
double tikhonovCutoffRegularizer(double value, std::vector< double > const &parameters)
Polyline< Dim > const & axisPolyline() const
Simple Polyline class providing a function to fit a polyline with defined precision to a BSpline for ...
double dTotalVariationRegularizer(double value, std::vector< double > const &parameters)
static bool const dataTermUsePerpendicularPointsOnly
void updateCoupledSplineModel(CoupledBSplineModel< Dim > &model, std::vector< blitz::TinyVector< double, Dim > > const &dAxisControlPoints, std::vector< double > const &dThicknessControlPoints, double tau)
double tikhonovRegularizer(double value, std::vector< double > const &parameters)
double dTotalVariationCutoffRegularizer(double value, std::vector< double > const &parameters)
double totalVariationRegularizer(double value, std::vector< double > const &parameters)
Energy refineModel(std::vector< blitz::TinyVector< double, Dim > > const &points, CoupledBSplineModel< Dim > &model, double kappa, double lambda, double mu, int nIter, double tau, double(&regularizer)(double, std::vector< double > const &)=tikhonovRegularizer, double(&dRegularizer)(double, std::vector< double > const &)=dTikhonovRegularizer, std::vector< double > const &regularizerParameters=std::vector< double >(), iRoCS::ProgressReporter *pr=NULL, std::string const &evolutionFileName="", std::string const &evolutionGroup="")
static bool const doLineSearch