我正在使用Java的InterpolationBilinear
类来帮助我重新采样数组。我当前(和相对较小的)测试用例是将10x10阵列转换为20x20阵列。我的问题是这个类中的interpolate(double[][], float x, float y)
方法只重新采样我发送它的2D数组的左上角(0x0,0x1,1x0,1x1)。
目前,看起来我必须编写一些代码来发送一个2x2数组而不是整个数组的interpolate方法。似乎有更好的方法,任何提示?
我对使用第三方库不感兴趣,只有标准的Java和我自己编写的代码。
谢谢!
答案 0 :(得分:1)
这就是InterpolationBilinear
类应该做的事情。请参阅documentation。它唯一能做的就是在矩形排列的四个点之间实现双线性插值。公式为explained here,你也可以很容易地自己实现它。
问题是:您的示例中的float x
和float y
是什么?对于InterpolationBilinear.interpolate
,它们应该代表样本矩形的四个角之间的小数位置。
或者您希望float x
和float y
表示数组中的元素编号?例如(4.3,7.1)是指在元素(4,7),(4,8),(5,7)和(5,8)之间进行插值?然后是的,您只需要将这四个值插入interpolate
(或您自己对该简单公式的实现)以及x中的分数位置0.3和y中的0.1。
编辑您现在已经澄清x
和y
应代表数组中的小数位置,我们称之为{{1}并且假设它是10 x 10,即两个维度中的索引从0到9。
要在raw[][]
处进行插值,您只需要找到方形(x,y)
落入的内容,并在四个角之间进行插值。在x方向上,索引将是紧邻(x,y)
上方和下方的整数,即x*9
和Math.floor(x*9)
- y中的相同想法,但Math.floor(x*9) + 1
。现在你有四个角落。将它们插入配方中。小数位置将类似于y*9
和xfrac = x*9 - Math.floor(x*9)
。也可以插入配方中的那些。
必须对目标数组中的每个点重复此操作。请注意,上面段落中的yfrac = y*9 - Math.floor(y*9)
将等于x
,而i/19
等于y
,其中j/19
和i
是索引您的目标数组。