0

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

1   2   3   4 

5   6   7   8

9  10  11  12

在 1 和 2 之间,当我放大原始二维阵列时,有 2 个孔。(乘以 3)

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

数组[y* 宽度 + 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)

这就是我知道我可以修补所谓的“双线性插值”的孔的方式。

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

4

1 回答 1

1

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

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

此外,您的除法是整数除法,并且不会做您想做的事情。

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

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

现在做水平,然后垂直。

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

与两线性刻度进行比较。它应该仅因舍入误差而有所不同。

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

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

于 2016-06-07T14:27:58.797 回答