DIC源码
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

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_