通过访问二维数组实现双线性插值的概念类似于一维数组

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

本文关键字:类似于 一维数组 插值 双线性 访问 二维数组 实现      更新时间:2023-10-16

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

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)

现在我可以像这个解决方案一样修补漏洞了。在双循环中,在条件(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)

这就是我知道我可以修补洞的方法,也就是所谓的"双线性插值"。

在将这个逻辑实现到代码中之前,我想确定我所知道的内容。感谢阅读。

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

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

此外,你的除法是整数除法,并不能做你想做的事。

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

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

现在先做水平,然后做垂直。

接下来,编写双线性版本,您可以使用线性版本再次测试三次(将在舍入误差范围内)。然后尝试双线性缩放图像,进行视觉检查。

与两个线性刻度进行比较。它应该只在舍入误差上有所不同。

在这些阶段中的每一个阶段;新的";可能出错的操作,而之前的代码已经过验证。

一次编写所有内容将导致复杂的错误代码。