Algorithm 图像插值(双三次或双线性)。如果没有相邻像素怎么办?

Algorithm 图像插值(双三次或双线性)。如果没有相邻像素怎么办?,algorithm,interpolation,Algorithm,Interpolation,由于JavaScript中没有插值的本机实现(除了最近邻之外),所以我尝试创建自己的方法。但考虑到双三次(或双线性)插值需要邻域像素(16或4),我应该如何处理不需要邻域数量的边缘像素?我应该忽略它们吗?但是插值公式需要所有像素 通常,您会为假想边缘像素生成一个值 最简单的方法是将所有边缘像素设置为白色或黑色,但将它们设置为最近的真实像素的颜色非常容易。如果一侧没有邻居,则为外推。如果要进行外推: 通过拉格朗日插值法完成: 重复最近的像素 不要使用白色或黑色,因为这将在边缘分别引入较亮或较暗的

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

通常,您会为假想边缘像素生成一个值


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

如果一侧没有邻居,则为外推。如果要进行外推:

通过拉格朗日插值法完成:
重复最近的像素


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

根据唐·兰卡斯特的文章《一些图像像素插值算法的回顾》(a Review of Some Image Pixel Interpolation Algorithms)(),替换最接近的已知值是解决问题的公认方法。这篇文章建议(ab)使用线性插值来外推值作为替代方法——但就我个人而言,我发现应用最近邻完成后的结果更符合我的喜好。

希望提供我的贡献,尽管这个问题很久以前就被问到了

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

  • 最近邻插值是一个0阶多项式。函数本身是不连续的(包含跳跃),即:其为C^0
  • 线性插值是一阶多项式。函数是连续的(无跳跃),但其导数不是
  • 对于(双)三次插值,使用的多项式为2阶;函数及其一阶导数是连续的(这确实是该方法所依据的标准)。这是“真”函数的三阶近似值;O(h^3)
遇到边缘问题时,您将希望使用与所选算法相同的近似顺序推断重影点的值。对于OP要求的(双)立方情况,如下所示。假设
[x1x2x3x4x5]
是您的输入值;您将希望计算
x0
为:

x0=3*x1-3*x2+x3
和类似的:
x6=3*x5-3*x4+x3