Python中常规网格的插值

时间:2014-07-27 04:57:45

标签: python numpy interpolation spatial-interpolation kriging

我一直在努力为'#34;空"提供数据。我的2D矩阵中的像素。基本上,我理解(但不是很深)插值技术,如反距离加权,克里金,双立方等。我不完全知道起点(在问题陈述或Python案例中)。

问题定义: 我有MxN矩阵(常规网格),其中每个像素代表一定的测量值( 此图中使用的数据 {{3 }})。我想插入"问号空间"的数据。 (使用相同大小但空白的像素组成的空白区域)使用现有数据作为蓝色像素。

Water evaporation in space

我的问题:

1)如何插入此数据。任何人都可以给我一个简单的例子(例如3x3矩阵)来清楚地理解它吗?

2)任何人都可以指导我如何在Python环境中执行解决方案的步骤吗?

3)如何使用Python比较精度意义上的插值技术?

4)你认为根据数据的密度使用不同的插值是个好主意吗?

我将非常感谢您的回答和建议。

1 个答案:

答案 0 :(得分:41)

什么是合理的解决方案在很大程度上取决于您试图用插值像素回答的问题 - 警告:对缺失数据进行外推会导致非常误导的答案!

径向基函数插值/内核平滑

就Python中可用的实用解决方案而言,填充这些像素的一种方法是使用Scipy实现的径向基函数插值(参见here),该插值用于分散数据的平滑/插值。

鉴于您的矩阵M和基础1D坐标数组rc(例如M.shape == (r.size, c.size)),其中M的缺失条目设置为nan ,这似乎与线性RBF内核相当好,如下所示:

import numpy as np
import scipy.interpolate as interpolate

with open('measurement.txt') as fh:
    M = np.vstack(map(float, r.split(' ')) for r in fh.read().splitlines())
r = np.linspace(0, 1, M.shape[0]) 
c = np.linspace(0, 1, M.shape[1])

rr, cc = np.meshgrid(r, c)
vals = ~np.isnan(M)
f = interpolate.Rbf(rr[vals], cc[vals], M[vals], function='linear')
interpolated = f(rr, cc)

这会产生以下与上面链接的数据的插值,虽然看起来很合理,但是突出显示缺失样本与实际数据的比率是多么不利:

RBF Interpolation

高斯过程回归/克里金

Kriging插值可以通过Gaussian Process Regression实现(它本身基于Matlab的DACE Kriging工具箱)在scikit-learn库中获得。这可以调用如下:

from sklearn.gaussian_process import GaussianProcess

gp = GaussianProcess(theta0=0.1, thetaL=.001, thetaU=1., nugget=0.01)
gp.fit(X=np.column_stack([rr[vals],cc[vals]]), y=M[vals])
rr_cc_as_cols = np.column_stack([rr.flatten(), cc.flatten()])
interpolated = gp.predict(rr_cc_as_cols).reshape(M.shape)

这产生了与上面的径向基函数示例非常相似的插值。在这两种情况下都需要探索很多参数 - 这些参数的选择很大程度上取决于您可以对数据做出的假设。 (上面的RBF示例中使用的线性内核的一个优点是它没有自由参数)

Kriging/Gaussian Process Regression

<强>图像修复

最后一点,完全visually motivated解决方案将使用OpenCV的inpainting功能,虽然这假设8位数组(0 - 255),并且没有直接的数学解释。