Python中规则网格上的插值

2024-04-19 07:42:25 发布

您现在位置:Python中文网/ 问答频道 /正文

我一直在努力将二维矩阵中“空”像素的数据显示出来。基本上,我了解(但不是很深入)插值技术,如反距离加权、Kriging、双三次等。我不确切地知道起点(无论是在问题陈述中还是在Python案例中)。

问题定义: 我有MxN矩阵(规则网格),其中每个像素表示特定的测量值(下图此图中使用的数据是here)。我想用我作为蓝色像素的现有数据来插值“问号空间”(白色空间也包含相同大小但为空的像素)区域的数据。

Water evaporation in space

我的问题:

1)如何插值此数据。有谁能给我一个简单的例子(如3x3矩阵)来清楚地理解这一点吗?

2)有谁能指导我如何在Python环境中执行通向解决方案的步骤吗?

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

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

我将感谢你的回答和建议。


Tags: 数据网格距离here定义规则空间矩阵
1条回答
网友
1楼 · 发布于 2024-04-19 07:42:25

什么是合理的解决方案很大程度上取决于你试图用插值像素回答的问题——请注意清空器:对丢失的数据进行外推会导致非常误导的答案!

径向基函数插值/核平滑

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

考虑到矩阵M和底层的一维坐标数组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

克里格插值可以通过scikit学习库中的Gaussian Process Regression实现(它本身基于用于Matlab的DACE克里格工具箱)获得。可按如下方式调用:

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),并且没有直接的数学解释。

相关问题 更多 >