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

4

由于JavaScript没有插值的本地实现(除了最近邻),我正在尝试自己制作方法。但考虑到双三次(或双线性)插值需要邻居像素(16或4个),对于没有足够邻居的边缘像素应该怎么办?我应该忽略它们吗?但插值公式要求所有像素。

5个回答

7

重复最近的像素。

不要使用白色或黑色,因为这会在边缘产生较浅或较暗的阴影。


4

3
通常,您需要为虚拟边缘像素设置一个值。
最简单的方法是将所有边缘像素设置为白色或黑色,但将它们设置为最近实际像素的颜色也很容易。

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


1
根据唐·兰卡斯特(Don Lancaster)的文章“一些图像像素插值算法的评论”(link),替换最近已知值是解决问题的一种可接受方式。该文章提出了(滥用)线性插值来作为替代方案来外推这些值 - 个人而言,我发现在应用最近邻完成后的结果更符合我的口味。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接