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

Posted

技术标签:

【中文标题】通过像一维数组一样访问二维数组的双线性插值的概念【英文标题】:The Concept of Bilinear Interpolation by Accessing 2-d array like 1-d array does 【发布时间】:2016-06-07 13:38:53 【问题描述】:

在二维数组中,有 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)

这是我知道我可以修补漏洞的方法,即所谓的“双线性插值”。

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

【问题讨论】:

你可以实现它,然后检查行为是否是你期望的,如果不是,调试:) 请记住:1/30 因为整数除法。您可以使您的(线性)插值更加明确:c = lerp(a, b, t); a,b,c 是像素/颜色分量,t 是浮点数(在您的情况下为 (j % 3) / 3.0f)。 【参考方案1】:

Bi 线性插值需要每个插值像素 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 次(将在舍入误差内)。然后尝试对图像进行双线性缩放,目视检查。

与双线性刻度比较。它应该只是舍入误差不同。

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

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

【讨论】:

以上是关于通过像一维数组一样访问二维数组的双线性插值的概念的主要内容,如果未能解决你的问题,请参考以下文章

opencv双线性插值

Java数组2----二维数组

Java数组2----二维数组

为啥我不能像行一样简单地获得一维数组?

Java 中的二维数组

Java数组