-3

我目前正在用 C 语言为 Matlab 编写一个 MEX 文件,以首先旋转图像,然后对其进行双三次插值。在研究时,我在https://www.paulinternet.nl/?page=bicubic上发现了 C++ 中双三次插值的部分实现。但是,那里的代码只插入一个 4 x 4 的区域,并且只返回一个插值而不是足够的值来填充初始区域。

谁能告诉我如何将双三次插值应用于整个图像?图像是否被分成 4x4 块,然后进行插值?如何获取图像整个区域的值?另外,函数“bicubicInterpolate”中的“x”和“y”到底是什么?

double 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 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);
}

我试图从这篇文章“https://stackoverflow.com/questions/20923956/bicubic-interpolation”的代码中看出这一点,但我不明白分数是如何计算的。

感谢您的帮助。

4

1 回答 1

0

好的,我想我找到了解决方案。在旋转过程中,像素的原始坐标存储为浮点数。然后将这些坐标提供给双三次插值算法。该算法对周围的 4x4 正方形进行采样,以计算像素的颜色或值。然后将该值返回给旋转算法并存储在像素的新坐标中。分数或在本例中为“x”是原始行或列的底值。

于 2021-04-20T19:13:01.800 回答