26

我一直在努力为我的二维矩阵中的“空”像素插入数据。基本上,我了解(但不深入)插值技术,例如反距离加权、克里金法、双三次等。我不确切知道起点(在问题陈述或 Python 案例中)。

问题定义: 我有 MxN 矩阵(规则网格),其中每个像素代表一定的测量值(下图该图中使用的数据在 这里)。我想使用我拥有的现有数据作为蓝色像素来插入“问号空间”(空白区域也由相同大小但空的像素组成)区域的数据。

太空中的水蒸发

我的问题:

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

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

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

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

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

4

1 回答 1

48

什么是明智的解决方案在很大程度上取决于您试图用插值像素回答什么问题——请注意:对丢失的数据进行外推可能会导致非常误导的答案!

径向基函数插值/核平滑

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

给定您的矩阵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 插值

高斯过程回归/克里金法

克里金插值可通过 scikit-learn 库中的高斯过程回归实现(它本身基于 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 示例中使用的线性内核的一个优点是它没有自由参数)

克里金/高斯过程回归

修补

最后,一个完全以视觉为动机的解决方案是使用 OpenCV 的修复功能,尽管这假设 8 位数组 (0 - 255),并且没有直接的数学解释。

于 2014-07-27T16:55:49.040 回答