缩放二维阵列使用双三次插值



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

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

更具体的要求:

据我所知,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),所以你不能只是在一些索引值切断输入数组)。这个边界框将成为新数组的范围,并且从输入数组中插入值。

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

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

有一段时间,我试图得到我自己的双三次插值算法开始(在这里得到一些灵感),在某些时候,它甚至看起来会实际工作,如果你只是想要一个体面的近似与数字一起工作,它可能很好。

但是:如果你用你花哨的新算法缩放图像,你会看到结果实际上有多糟糕。所以,除非你真正掌握了它背后的数学知识,并且知道自己在做什么(你并不知道,因为这就是你读这篇文章的原因),否则不要尝试自己编写代码。

我的解决方法是:获取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属于公共领域。

相关内容

  • 没有找到相关文章

最新更新