You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
104 lines
2.5 KiB
104 lines
2.5 KiB
3 months ago
|
|
||
|
|
||
|
#pragma once
|
||
|
|
||
|
#ifndef _CUBIC_BSPLINE_H_
|
||
|
#define _CUBIC_BSPLINE_H_
|
||
|
|
||
|
#include "oc_interpolation.h"
|
||
|
|
||
|
namespace opencorr
|
||
|
{
|
||
|
|
||
|
class BicubicBspline : public Interpolation2D
|
||
|
{
|
||
|
public:
|
||
|
BicubicBspline(Image2D& image);
|
||
|
~BicubicBspline();
|
||
|
|
||
|
void prepare();
|
||
|
float compute(Point2D& location);
|
||
|
|
||
|
private:
|
||
|
|
||
|
float**** interp_coefficient = nullptr;
|
||
|
|
||
|
const float CONTROL_MATRIX[4][4] =
|
||
|
{
|
||
|
{ 71.0f / 56.0f, -19.0f / 56.0f, 5 / 56.0f, -1.0f / 56.0f },
|
||
|
{ -19.0f / 56.0f, 95.0f / 56.0f, -25 / 56.0f, 5.0f / 56.0f },
|
||
|
{ 5.0f / 56.0f, -25.0f / 56.0f, 95 / 56.0f, -19.0f / 56.0f },
|
||
|
{ -1.0f / 56.0f, 5.0f / 56.0f, -19 / 56.0f, 71.0f / 56.0f }
|
||
|
};
|
||
|
|
||
|
const float FUNCTION_MATRIX[4][4] =
|
||
|
{
|
||
|
{ -1.0f / 6.0f, 3.0f / 6.0f, -3.0f / 6.0f, 1.0f / 6.0f },
|
||
|
{ 3.0f / 6.0f, -6.0f / 6.0f, 3.0f / 6.0f, 0.0f },
|
||
|
{ -3.0f / 6.0f, 0.0f, 3.0f / 6.0f, 0.0f },
|
||
|
{ 1.0f / 6.0f, 4.0f / 6.0f, 1.0f / 6.0f, 0.0f }
|
||
|
};
|
||
|
};
|
||
|
|
||
|
//the 3D part of module is the implementation of
|
||
|
//J. Yang et al, Optics and Lasers in Engineering (2021) 136: 106323.
|
||
|
//https://doi.org/10.1016/j.optlaseng.2020.106323
|
||
|
|
||
|
class TricubicBspline : public Interpolation3D
|
||
|
{
|
||
|
public:
|
||
|
TricubicBspline(Image3D& image);
|
||
|
~TricubicBspline();
|
||
|
|
||
|
void prepare();
|
||
|
float compute(Point3D& location);
|
||
|
|
||
|
private:
|
||
|
float*** interp_coefficient = nullptr;
|
||
|
|
||
|
//B-spline prefilter
|
||
|
const float BSPLINE_PREFILTER[8] =
|
||
|
{
|
||
|
1.732176555412860f, //b0
|
||
|
-0.464135309171000f, //b1
|
||
|
0.124364681271139f, //b2
|
||
|
-0.033323415913556f, //b3
|
||
|
0.008928982383084f, //b4
|
||
|
-0.002392513618779f, //b5
|
||
|
0.000641072092032f, //b6
|
||
|
-0.000171774749350f, //b7
|
||
|
};
|
||
|
|
||
|
};
|
||
|
|
||
|
//Four cubic B-spline basis functions when input falls in different range
|
||
|
inline float basis0(float coor_decimal)
|
||
|
{
|
||
|
return (1.f / 6.f) * (coor_decimal * (coor_decimal * (-coor_decimal + 3.f) - 3.f) + 1.f); //(1/6)*(2-(x+1))^3 for x-(-1)
|
||
|
}
|
||
|
|
||
|
inline float basis1(float coor_decimal)
|
||
|
{
|
||
|
return (1.f / 6.f) * (coor_decimal * coor_decimal * (3.f * coor_decimal - 6.f) + 4.f); //(2/3)-(1/2)*(2-x)*x^2 for x-0
|
||
|
}
|
||
|
|
||
|
inline float basis2(float coor_decimal)
|
||
|
{
|
||
|
return (1.f / 6.f) * (coor_decimal * (coor_decimal * (-3.f * coor_decimal + 3.f) + 3.f) + 1.f); //(2/3)-(1/2)*(2-(1-x))*(1-x)^2 for x-1
|
||
|
}
|
||
|
|
||
|
inline float basis3(float coor_decimal)
|
||
|
{
|
||
|
return (1.f / 6.f) * (coor_decimal * coor_decimal * coor_decimal); //(1/6)*(2-(2-x))^3 for x-2
|
||
|
}
|
||
|
|
||
|
//return the lower value of the two inputs
|
||
|
int getLow(int x, int y);
|
||
|
|
||
|
//retrun the higher value of the two inputs
|
||
|
int getHigh(int x, int y);
|
||
|
|
||
|
}//namespace opencorr
|
||
|
|
||
|
#endif //_CUBIC_BSPLINE_H_
|