通过像一维数组一样访问二维数组来实现双线性插值的概念

The Concept of Bilinear Interpolation by Accessing 2-d array like 1-d array does

在二维数组中,有bmp文件的像素。它的大小是我缩放的宽度(3 * 65536)*高度(3 * 65536)。 就像这样。

1   2   3   4 

5   6   7   8

9  10  11  12

在1和2之间,有2个孔,因为我把原来的二维数组放大了。 ( 乘以 3 )

我使用这样的一维数组访问方法。

array[y* width + x]

index
0 1 2 3 4 5 6 7 8 9...   
1     2     3     4    5    6    7    8    9    10    11    12
(this array is actually 2-d array and is scaled by multiplying 3)

现在我可以像这个解决方案一样修补漏洞。 在双 for 循环中,在条件 (j%3==1)

Image[i*width+j] = Image[i*width+(j-1)]*(1-1/3) + Image[i*width+(j+2)]*(1-2/3)

另一种情况(j%3==2)

Image[i*width+j] = Image[i*width+(j-2)]*(1-2/3) + Image[i*width+(j+1)]*(1-1/3)

这是我知道我可以修补所谓 "Bilinear Interpolation" 漏洞的方法。

在我的代码中实现这个逻辑之前,我想确定我知道什么。谢谢阅读。

双线性插值需要每个插值像素进行 2 次线性插值(水平和垂直)(好吧,其中一些只需要 1 次),或者每个插值像素最多需要 4 个源像素。

1和2之间有两个洞。 1 和 5 之间有 2 个孔。 1 和 6 之间有 4 个孔。您编写的代码只能修补 1 和 2 之间的漏洞,不能正确修补其他漏洞。

另外你的除法是整数除法,不是你想要的

通常,您最好编写一个 r=interpolate_between(a,b,x,y) 函数,该函数在 a 和 b 之间插值,从 y 开始在第 x 步进行插值。然后测试并修复。现在使用它 水平 缩放您的图像,并目视检查是否正确(尤其是边缘!)

现在尝试使用它仅垂直缩放。

现在水平,然后垂直。

接下来写双线性版本,你可以用线性版本再测试三次(会在舍入误差范围内)。然后尝试双线性缩放图像,目视检查。

与双线性比例进行比较。它应该仅因舍入误差而异。

在每个阶段,您都会有一个可能出错的“新”操作,之前的代码已经过验证。

一次编写所有内容会导致代码复杂且漏洞百出。