当前位置:  开发笔记 > 编程语言 > 正文

如何在数据点之间插值?

如何解决《如何在数据点之间插值?》经验,为你挑选了2个好方法。

我目前正在开发一个使用opencv和qt绘制数据点的软件.我需要能够从不完整的数据中填写图像.我想在我拥有的点之间进行插值.任何人都可以推荐一个可以帮助我的库或功能.我想也许是opencv reMap方法,但我似乎无法让它工作.

数据是强度值的2维矩阵.我想创建某种形象.这是一个学校项目.



1> 小智..:

插值是一个复杂的主题.插入一组点的方法有很多种,假设你真的希望进行插值,而不是任何类型的平滑.(插值完全再现了原始数据点.)当然,这个问题的二维特性使事情变得更加困难.

在2-d中有几种常见的散乱数据插值方案.实际上,对于那些可以访问它的人来说,可以获得一篇非常好的论文(Richard Franke,"散乱数据插值:某些方法的测试",计算数学,1982年.)

也许最常用的方法是基于数据的三角测量.仅从您的数据点构建域的三角测量.然后,数据的凸包内的任何点必须完全位于其中一个三角形内,或者它将位于共享边上.这允许您在三角形内部线性插值.如果您使用的是MATLAB,那么函数griddata可用于此目的.)

尝试从散点填充完整的矩形图像时的问题是,数据很可能不会延伸到数组的4个角.在那种情况下,基于三角测量的方案将失败,因为阵列的角落不在散射点的凸包内.另一种方法是使用"径向基函数"(通常缩写为RBF).当地质统计学界使用时,有很多这样的方案,包括克里金.

http://en.wikipedia.org/wiki/Kriging

最后,修复是插值方案的名称,其中元素以数组形式给出,但缺少元素.这个名字显然是指由艺术保管员完成的,他需要修复一件有价值的艺术品中的撕裂或撕裂.

http://en.wikipedia.org/wiki/Inpainting

修复背后的想法通常是制定边界值问题.也就是说,在有孔的区域上定义偏微分方程.使用已知的边界值,通过求解未知元素的PDE来填充孔.如果存在大量未知元素,则这可能是计算密集型的,因为它通常需要至少一个大规模稀疏线性方程组的解.如果PDE是非线性的,那么它就成了一个更加密集的问题.PDE的一个简单,合理的好选择是拉普拉斯算子,它产生一个线性系统,可以很好地推断.同样,我可以为MATLAB用户提供解决方案.

http://www.mathworks.com/matlabcentral/fileexchange/4551

PDE的更好选择可能来自非线性PDE.一旦这是Navier/Stokes方程.它非常适合对通常看到的表面类型进行建模,但也更难以处理.正如在生活的许多方面,你得到你付出的代价.



2> dmckee..:

唷!大话题.

"正确"答案取决于很多关于您的问题域和你在做什么的各种细节.

插值超过1维需要做出一些选择.我假设您正在绘制常规网格,但是您的某些网格点没有数据.很大的问题:稀缺的缺点是什么,还是他们做了大blob?

无法添加信息,所以您只是想尝试建立一些看起来不错的东西.

概念上简单的建议(但实施可能是一些工作):

对于缺失数据的每个区域,识别所有边缘点.那是在这个图中找到x

oooxxooo
oox..xoo 
oox...xo
ox..xxoo
oox.xooo
oooxoooo

其中.是缺失数据的点,而x和o有数据(对于一个缺失点,这将是四个最近邻居).使用此blob周围的边缘点的平均值填充每个缺失的数据点.为了使其平滑,对每个点进行加权,1/d其中d是两点之间的taxidriver距离(delta x + delta y).


从我们之前有任何细节:

在没有这种信息的情况下,您是否尝试过直线插值?如果您的数据相当密集,这可能会为您做到,并且在您需要时可以很容易地在线编码.

下一步通常是三次样条函数,但为此你可能想要获取现有的实现.


当我需要比快速线性插值更强大的东西时,我通常使用ROOT(并选择一个TSpline类),但这可能比你需要的开销更大.

正如评论中所指出的那样,ROOT 很大,虽然速度很快,但它确实试图强迫你以ROOT的方式做事,所以它会对你的程序产生很大的影响.


两点(x1,y1)和(x2,y2)之间的线性插值(或实际上是外推)给你

 y_i = (x_i-x1)*(y2-y1)/(x2-x1)

推荐阅读
地之南_816
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有