C++ 双三次插值-Matlab到C++;

C++ 双三次插值-Matlab到C++;,c++,matlab,opencv,image-processing,interpolation,C++,Matlab,Opencv,Image Processing,Interpolation,我试图实现双三次插值 这是我问题的后续问题: 关于imresize,我知道openCV不像matlab那样做三次插值。 我需要得到和matlab一样的结果。对于imresize 举个例子,我只想得到图像的第一个像素 int* Utilities::MatlabImresize(int* channel,int width, int height, double scale) { double test[4][4] = {{channel[0],channel[1], channel[2]

我试图实现双三次插值

这是我问题的后续问题:
关于imresize,我知道openCV不像matlab那样做三次插值。 我需要得到和matlab一样的结果。对于imresize

举个例子,我只想得到图像的第一个像素

int* Utilities::MatlabImresize(int* channel,int width, int height, double scale)
{
    double test[4][4] = {{channel[0],channel[1], channel[2], channel[3]},
                        {channel[width],channel[width+1], channel[width+2], channel[width+3]},
                        {channel[2*width],channel[2*width+1], channel[2*width+2], channel[2*width+3]},
                        {channel[3*width],channel[3*width+1], channel[3*width+2], channel[3*width+3]}};
    double x = bicubicInterpolate(test,0.5,0.5);

    return NULL;
}


double Utilities::cubicInterpolate (double p[4], double x) 
{
    return p[1] + 0.5 * x*(p[2] - p[0] + x*(2.0*p[0] - 5.0*p[1] + 4.0*p[2] - p[3] + x*(3.0*(p[1] - p[2]) + p[3] - p[0])));
}

double Utilities::bicubicInterpolate (double p[4][4], double x, double y) 
{
    double arr[4];
    arr[0] = cubicInterpolate(p[0], y);
    arr[1] = cubicInterpolate(p[1], y);
    arr[2] = cubicInterpolate(p[2], y);
    arr[3] = cubicInterpolate(p[3], y);
    return cubicInterpolate(arr, x);
}
我仍然没有得到相同的结果,所以我猜我的内核与matlab使用的不一样。我怎样才能得到同样的结果

**我原来的4x4

155306155306
293 213 293 213
172 325 172 324
291198290198

我从matlab获得的结果:

151.196136474609155.925476074219155.555526733398145.714401245117
151.044921875000 155.254089355469157.459579467773154.982849121094
149.49034118652151.587142944336150.641662597656155.392364501953
153.66691589355156.283508300781 156.848739624023 155.557098388672
147.997482299805154.688049316406157.798034667969152.91279602058

我对像素0,0的结果为155.3437500000000

更新:
根据@andrey的建议,我进入了imresize代码
这是上面写的:

用于数字图像处理的三次卷积插值,“IEEE 声学、语音和信号处理方面的交易,卷。 ASSP-29,第6号,1981年12月,第1155页

absx=abs(x);
absx2=absx.^2;
absx3=absx.^3;

f=(1.5*absx3-2.5*absx2+1)。*(absx您可以查看它是如何在MATLAB中实现的。在脚本中键入imresize,然后在其上单击鼠标右键,并在上下文菜单中选择open“imresize”。以下是后续问题,供将来参考
absx = abs(x);
absx2 = absx.^2;
absx3 = absx.^3;

f = (1.5*absx3 - 2.5*absx2 + 1) .* (absx <= 1) + ...
                (-0.5*absx3 + 2.5*absx2 - 4*absx + 2) .* ...
                ((1 < absx) & (absx <= 2));
float Utilities::Cubic(const float& x, const float& scale)
{
  /*
  % See Keys, "Cubic Convolution Interpolation for Digital Image
  % Processing," IEEE Transactions on Acoustics, Speech, and Signal
  % Processing, Vol. ASSP-29, No. 6, December 1981, p. 1155.
  */

  float absx = fabs(x*scale);
  float absx2 = pow(absx, 2);
  float absx3 = pow(absx, 3);

  float f = (1.5*absx3 - 2.5*absx2 + 1) * (absx <= 1) +
            (-0.5*absx3 + 2.5*absx2 - 4*absx + 2) *
            ((1 < absx) & (absx <= 2));

  return f*scale;
}