三次插值

优化问题通常涉及以值表形式给出的函数,例如一幅图像。计算这些函数以及他们的导数需要对这些值进行插值。插值表格函数是一个广泛的研究领域,有许多库已经实现了一些插值问题。然而,在cere的自动求导框架中去是很困难的。为此,ceres提供了对一维和两维的表格函数的插值能力。

一维的插值是基于Cubic Hermite Spline,也称为Catmull-Rom Spline。这生成一阶差分插值函数。二维插值格式是一维插值格式的推广,在两维中一维的插值函数是分开的。

更多细节参考:More details of the construction can be found Linear Methods for Image Interpolation by Pascal Getreuer.

class CubicInterpolator

给定一个无限的一维网格作为输入,其提供了以下接口:

struct Grid1D {
  enum { DATA_DIMENSION = 2; };
  void GetValue(int n, double* f) const;
};

函数GetValue给出了一个函数f(可能是向量值)的值,在给定任意的n和用于指示被插函数的维度DATA_DIMENSION。例如:如果打算以角轴的格式插值旋转,那么DATA_DIMENSION=3。

CubicInterpolator 使用Cubic Hermite splines来生成一个平滑的近似于它的值,其可以用来估计f(x)以及f'(x)在任何的实数线上的点。例如,以下代码对四个元素的数组进行插值。

const double x[] = {1.0, 2.0, 5.0, 6.0};
Grid1D<double, 1> array(x, 0, 4);
CubicInterpolator interpolator(array);
double f, dfdx;
interpolator.Evaluate(1.5, &f, &dfdx);

以上代码使用Grid1D模板类来与c++数组和CubicInterpolator相交互。

Grid1D支持向量值函数其中函数的各种坐标可以交错或堆叠。它还允许使用任何数字类型作为输入,只要它可以安全地转换为double。

 

class BiCubicInterpolator

给定一个无线二维网格作为输入,该网格提供以下接口:

struct Grid2D
{
 enum {DATA_DIMENSION = 2};
void GetValue(int row, int col, double* f) const;
}

GetValue函数给出函数f(可能是向量值)在任何整数对row和col下的值;DATA_DIMENSION指出被插值函数的维数。例如,如果想对一副彩色图有三个通道进行插值,那么DATA_DIMENSION=3。

BiCubicInterpolator使用三次卷积插值算法R.keys来生成一个平滑的近似值,可以用来计算在实平面中任一点的

例如以下代码对一个二维数组进行插值:

const double data[] = {1.0, 3.0, -1.0, 4.0,
                       3.6, 2.1,  4.2, 2.0,
                       2.0, 1.0,  3.1, 5.2};
Grid2D<double, 1>  array(data, 0, 3, 0, 4);
BiCubicInterpolator interpolator(array);
double f, dfdr, dfdc;
interpolator.Evaluate(1.2, 2.5, &f, &dfdr, &dfdc);

以上代码,模板类Grid2D用于让c++数据像一个两维的表对于BiCubicInterpolator来说。

Grid2D支持行或列优先的布局。它支持向量值函数,其中,函数的各个坐标可以交错或堆叠。它还允许使用任何数字类型作为输入,只要它可以安全地转换为double。

 

posted on 2022-08-23 17:25  gary_123  阅读(320)  评论(0编辑  收藏  举报

导航