0

我想将任意缩放到具有不同尺寸double[][]的另一个。double[][]应使用双三次插值基于输入数组计算结果数组的值。

我知道这已经在图像处理中完成了几十年,但是我找不到适用于任何二维数组而不是某些特定图像对象的库或至少一个工作代码片段,所以这就是我在这里问的原因。

更具体的要求:

据我了解,可以使用双三次插值直接计算 3x3 网格角之间的任何点的值,所以我需要的第一个函数类似于

double interpolate(double[][] grid3by3, double x, double y)`

其中 x 和 y 介于 0.0 和 1.0 之间

下一步当然是简化这个过程,以便为每个点自动选择 3x3 网格,我可以得到类似的东西

`double[][] interpolate(double[][] input, int newWidth, int newHeight)`

这将为我提供一个具有指定尺寸但与输入数组具有相同边框的新数组。

我真正想要得到的是:

`double[][] interpolate(double[][] input, int newWidth, int newHeight,
                        double minX, double minY, double maxX, double maxY)`

最小值和最大值定义了一个边界框,因此我可以获得初始数组的子集,它不一定需要在输入数组的确切索引值处开始或结束(例如,角可以在 (5,3) 或(5.25, 3.7),所以你不能只在某个索引值处切断输入数组)。这个边界框将成为新数组的范围,并且值是从输入数组中插入的。

哦,仅供参考:这是关于数字高程模型,所以请告诉我我的方法是否完全错误;)

4

1 回答 1

0

只是想分享我是如何解决问题的(或者更确切地说,我没有):

有一段时间,我试图开始我自己的双三次插值算法(在这里获得一些灵感),在某些时候,它甚至看起来确实可以工作,如果你只是想要一个像样的近似来处理数字,它可能美好的。

但是:如果你用你喜欢的新算法缩放图像,你会看到结果实际上是多么糟糕。因此,除非你真的了解它背后的数学并且你知道你在做什么(你不知道,因为这就是你阅读本文的原因),否则不要尝试自己编写代码。

这是我的解决方法:获取ImageJ并执行以下操作:

// works all the same for: byte, short, int
float[] myData;     
// create a new image. change 32 to 16 for short or 8 for byte
ImageStack stack = ImageStack.create(width, height, 1, 32);
stack.setPixels(myData, 1);
ImageProcessor processor = new ImagePlus("", stack).getProcessor();
// crop and scale
processor.setRoi(x, y, rwidth, rheight);
ImageProcessor result = processor.crop().resize(newWidth, newHeight);
// retrieve results
float[] myScaledData = (float[]) result.getPixels();

我知道,这不是它的用途,不幸的是,没有适用于 64 位数据类型的函数,但结果是高质量的,ImageJ 并没有那么大的重量......不过,你可以复制和贴上相关代码部分,ImageJ 属于公有领域。

于 2013-12-05T18:36:39.690 回答