#ifndef _LSVM_DIST_TRANSFORM_H_ #define _LSVM_DIST_TRANSFORM_H_ #include "_lsvm_types.h" #include "_lsvm_error.h" /* // Computation the point of intersection functions // (parabolas on the variable y) // a(y - q1) + b(q1 - y)(q1 - y) + f[q1] // a(y - q2) + b(q2 - y)(q2 - y) + f[q2] // // API // int GetPointOfIntersection(const F_type *f, const F_type a, const F_type b, int q1, int q2, F_type *point); // INPUT // f - function on the regular grid // a - coefficient of the function // b - coefficient of the function // q1 - parameter of the function // q2 - parameter of the function // OUTPUT // point - point of intersection // RESULT // Error status */ int GetPointOfIntersection(const float *f, const float a, const float b, int q1, int q2, float *point); /* // Decision of one dimensional problem generalized distance transform // on the regular grid at all points // min (a(y' - y) + b(y' - y)(y' - y) + f(y')) (on y') // // API // int DistanceTransformOneDimensionalProblem(const F_type *f, const int n, const F_type a, const F_type b, F_type *distanceTransform, int *points); // INPUT // f - function on the regular grid // n - grid dimension // a - coefficient of optimizable function // b - coefficient of optimizable function // OUTPUT // distanceTransform - values of generalized distance transform // points - arguments that corresponds to the optimal value of function // RESULT // Error status */ int DistanceTransformOneDimensionalProblem(const float *f, const int n, const float a, const float b, float *distanceTransform, int *points); /* // Computation next cycle element // // API // int GetNextCycleElement(int k, int n, int q); // INPUT // k - index of the previous cycle element // n - number of matrix rows // q - parameter that equal (number_of_rows * number_of_columns - 1) // OUTPUT // None // RESULT // Next cycle element */ int GetNextCycleElement(int k, int n, int q); /* // Transposition of cycle elements // // API // void TransposeCycleElements(F_type *a, int *cycle, int cycle_len); // INPUT // a - initial matrix // cycle - cycle // cycle_len - cycle length // OUTPUT // a - matrix with transposed elements // RESULT // None */ void TransposeCycleElements(float *a, int *cycle, int cycle_len); /* // Getting transposed matrix // // API // void Transpose(F_type *a, int n, int m); // INPUT // a - initial matrix // n - number of rows // m - number of columns // OUTPUT // a - transposed matrix // RESULT // Error status */ void Transpose(float *a, int n, int m); /* // Decision of two dimensional problem generalized distance transform // on the regular grid at all points // min{d2(y' - y) + d4(y' - y)(y' - y) + min(d1(x' - x) + d3(x' - x)(x' - x) + f(x',y'))} (on x', y') // // API // int DistanceTransformTwoDimensionalProblem(const F_type *f, const int n, const int m, const F_type coeff[4], F_type *distanceTransform, int *pointsX, int *pointsY); // INPUT // f - function on the regular grid // n - number of rows // m - number of columns // coeff - coefficients of optimizable function coeff[0] = d1, coeff[1] = d2, coeff[2] = d3, coeff[3] = d4 // OUTPUT // distanceTransform - values of generalized distance transform // pointsX - arguments x' that correspond to the optimal value // pointsY - arguments y' that correspond to the optimal value // RESULT // Error status */ int DistanceTransformTwoDimensionalProblem(const float *f, const int n, const int m, const float coeff[4], float *distanceTransform, int *pointsX, int *pointsY); #endif