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

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

有帮助吗?

解决方案

唷!大主题。

“正确”答案取决于您的问题域很多以及您正在做的事情的各种细节。

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

无法添加信息,因此您只是尝试建立外观确定的内容。

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

对于缺失数据的每个区域,识别所有边缘点。那是在这个图中找到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是 big ,虽然速度很快,但它会尝试强制您以ROOT方式执行操作,因此它会对您的程序产生很大影响。


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

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

其他提示

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

在2-d中有几种常见的散乱数据插值方案。实际上,对于那些可以访问它的人来说,可以获得一篇非常好的论文(Richard Franke,“Scattered data interpolation:Tests of some methods”,Mathematics of Computation,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的更好选择可能来自非线性偏微分方程。一旦这是Navier / Stokes方程。它非常适合对通常看到的表面类型进行建模,但也更难以处理。正如在生活的许多方面,你得到你付出的代价。

考虑到这是一个简单的学校项目,可能最容易实现的插值技术是“最近的邻居”

对于每个缺失的数据点,您会找到最近的“已填充”数据点。数据点并将其用作值。

如果你想进一步改善结果,那么你可以说,找到K个最近的数据点,并使用它们的加权平均值作为你缺失数据点的值。

重量可以与点与缺失数据点的距离成比例。

有许多其他技术,但最近的邻居可能是最容易实现的。

如果我了解您的需求如下。

我认为你有一个x,y,强度为L乘W的强度的子集,你想要填充所有X,范围从0到L,Y范围从0到W.

如果这是您的问题,那么解决方案是通过使用过滤器来获得其他强度。

我认为拜耳滤波器或高斯滤波器可以帮到你。

您可以谷歌这些过滤器,您将获得实施的答案。

祝你好运。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top