Java中大型数组的双线性插值

时间:2011-10-13 12:58:39

标签: java arrays interpolation sampling

我正在使用Java的InterpolationBilinear类来帮助我重新采样数组。我当前(和相对较小的)测试用例是将10x10阵列转换为20x20阵列。我的问题是这个类中的interpolate(double[][], float x, float y)方法只重新采样我发送它的2D数组的左上角(0x0,0x1,1x0,1x1)。

目前,看起来我必须编写一些代码来发送一个2x2数组而不是整个数组的interpolate方法。似乎有更好的方法,任何提示?

我对使用第三方库不感兴趣,只有标准的Java和我自己编写的代码。

谢谢!

1 个答案:

答案 0 :(得分:1)

这就是InterpolationBilinear类应该做的事情。请参阅documentation。它唯一能做的就是在矩形排列的四个点之间实现双线性插值。公式为explained here,你也可以很容易地自己实现它。

问题是:您的示例中的float xfloat y是什么?对于InterpolationBilinear.interpolate,它们应该代表样本矩形的四个角之间的小数位置。

或者您希望float xfloat y表示数组中的元素编号?例如(4.3,7.1)是指在元素(4,7),(4,8),(5,7)和(5,8)之间进行插值?然后是的,您只需要将这四个值插入interpolate(或您自己对该简单公式的实现)以及x中的分数位置0.3和y中的0.1。

编辑您现在已经澄清xy应代表数组中的小数位置,我们称之为{{1}并且假设它是10 x 10,即两个维度中的索引从0到9。

要在raw[][]处进行插值,您只需要找到方形(x,y)落入的内容,并在四个角之间进行插值。在x方向上,索引将是紧邻(x,y)上方和下方的整数,即x*9Math.floor(x*9) - y中的相同想法,但Math.floor(x*9) + 1。现在你有四个角落。将它们插入配方中。小数位置将类似于y*9xfrac = x*9 - Math.floor(x*9)。也可以插入配方中的那些。

必须对目标数组中的每个点重复此操作。请注意,上面段落中的yfrac = y*9 - Math.floor(y*9)将等于x,而i/19等于y,其中j/19i是索引您的目标数组。