在二维数组中,有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之间进行插值。然后测试并修复。现在使用它水平缩放图像,并目视检查是否正确(尤其是边缘!)
现在尝试使用它仅垂直缩放。
现在先做水平,然后做垂直。
接下来,编写双线性版本,您可以使用线性版本再次测试三次(将在舍入误差范围内)。然后尝试双线性缩放图像,进行视觉检查。
与两个线性刻度进行比较。它应该只在舍入误差上有所不同。
在这些阶段中的每一个阶段;新的";可能出错的操作,而之前的代码已经过验证。
一次编写所有内容将导致复杂的错误代码。