36#ifndef VIGRA_RBF_REGISTRATION_HXX
37#define VIGRA_RBF_REGISTRATION_HXX
39#include <vigra/mathutil.hxx>
40#include <vigra/matrix.hxx>
41#include <vigra/linear_solve.hxx>
42#include <vigra/tinyvector.hxx>
43#include <vigra/splineimageview.hxx>
44#include <vigra/affine_registration.hxx>
56template <
class SrcPo
int,
class DestPo
int>
57inline double distance2(SrcPoint
const & p1, DestPoint
const & p2)
59 return (
double)(p1[0]-p2[0])*(p1[0]-p2[0]) + (p1[1]-p2[1])*(p1[1]-p2[1]);
71 template <
class SrcPo
int,
class DestPo
int>
74 double dist2 = detail::distance2(p1, p2);
93 template <
class SrcPo
int,
class DestPo
int>
96 double dist2 = detail::distance2(p1, p2);
104 return pow(
dist2, N/2.0);
125linalg::TemporaryMatrix<double>
148 for(
int i=0;
i<
j;
i++)
154 linearSolve(
L,
Y,
W);
232template <
int ORDER,
class T,
233 class DestIterator,
class DestAccessor,
234 class DestPointIterator,
236 class RadialBasisFunctor>
246 vigra_precondition(rowCount(
W) ==
point_count+3 && columnCount(
W) == 2,
247 "vigra::rbfWarpImage(): matrix doesn't represent a proper transformation of given point size in 2D coordinates.");
252 for(
double y = 0.0; y <
h; ++y, ++
dul.y)
254 typename DestIterator::row_iterator rd =
dul.rowIterator();
255 for(
double x=0.0; x < w; ++x, ++rd)
276template <
int ORDER,
class T,
277 class DestIterator,
class DestAccessor,
278 class DestPointIterator,
280 class RadialBasisFunctor>
283 triple<DestIterator, DestIterator, DestAccessor> dest,
284 DestPointIterator d, DestPointIterator d_end,
285 MultiArrayView<2, double, C>
const & W,
286 RadialBasisFunctor rbf)
288 rbfWarpImage(src, dest.first, dest.second, dest.third, d, d_end, W, rbf);
291template <
int ORDER,
class T,
293 class DestPointIterator,
295 class RadialBasisFunctor>
298 MultiArrayView<2, T2, S2> dest,
299 DestPointIterator d, DestPointIterator d_end,
300 MultiArrayView<2, double, C>
const & W,
301 RadialBasisFunctor rbf)
303 rbfWarpImage(src, destImageRange(dest), d, d_end, W, rbf);
Two dimensional difference vector.
Definition diff2d.hxx:186
Class for a single RGB value.
Definition rgbvalue.hxx:128
linalg::TemporaryMatrix< double > rbfMatrix2DFromCorrespondingPoints(SrcPointIterator s, SrcPointIterator s_end, DestPointIterator d, RadialBasisFunctor const &rbf)
Create a matrix that maps corresponding points onto each other using a given RBF.
Definition rbf_registration.hxx:126
void rbfWarpImage(SplineImageView< ORDER, T > const &src, DestIterator dul, DestIterator dlr, DestAccessor dest, DestPointIterator d, DestPointIterator d_end, MultiArrayView< 2, double, C > const &W, RadialBasisFunctor rbf)
Warp an image according to an radial basis function based transformation.
Definition rbf_registration.hxx:238
Definition rbf_registration.hxx:92
Definition rbf_registration.hxx:70