4

由于 JavaScript 中没有本地插值实现(除了最近邻),我正在尝试制作自己的方法。但是考虑到双三次(或双线性)插值需要相邻像素(16 或 4),我应该如何处理不需要相邻数量的边缘像素?我应该忽略它们吗?但是插值公式需要所有像素。

4

5 回答 5

7

重复最近的像素。

不要使用白色或黑色,因为这会分别在边缘引入较浅或较深的阴影。

于 2012-08-16T19:21:22.053 回答
4

如果一侧没有邻居,则为外推。如果你想推断: http ://en.wikipedia.org/wiki/Extrapolation

它由拉格朗日插值完成: http ://en.wikipedia.org/wiki/Lagrange_interpolation

于 2012-08-16T16:51:32.727 回答
3

通常,您为虚构的边缘像素构成一个值。

最简单的方法是将所有边缘像素设置为白色或黑色,但很容易将它们设置为最近的真实像素的颜色。

于 2012-08-16T16:38:30.873 回答
2

想提供我的贡献,即使这个问题是很久以前提出的。

就像 Kendall 所说,您通常根据附近的值来构成点/像素的值。您应该如何执行此操作取决于您选择的插值。更具体地说,它由您的方法的插值多项​​式的阶数决定。对于OP提到的方法,这些方法如下:

  • 最近邻插值是0阶多项式。函数本身是不连续的(包含跳跃),即:其平滑度为C^0;
  • 线性插值是一阶多项式。该函数是连续的(没有跳跃),但它的导数不是。
  • 对于(双)三次插值,使用的多项式是 2 阶的;函数及其一阶导数是连续的(这确实是该方法所基于的标准)。这是“真”函数的三阶近似;O(h^3)。

遇到边缘问题时,您将需要使用与您选择的算法相同的近似值来推断鬼点的值。对于 OP 要求的(双)立方情况,如下所示。假设这[x1 x2 x3 x4 x5]是您的输入值;您将要计算x0为:

x0 = 3*x1 - 3*x2 + x3并且,类似地:x6 = 3*x5 - 3*x4 + x3

于 2018-05-17T16:08:02.073 回答
1

根据 Don Lancaster 的文章“A Review of Some Image Pixel Interpolation Algorithms”(链接),替换最接近的已知值是解决问题的公认方法。这篇文章建议(ab)使用线性插值来推断值作为替代方案 - 不过,我个人在应用最近邻补全后发现结果更符合我的喜好。

于 2012-09-25T19:28:09.637 回答