Spi*_*der 23 python interpolation numpy spatial-interpolation kriging
我一直在努力为我的2D矩阵中的"空"像素提供数据.基本上,我理解(但不是很深)插值技术,如反距离加权,克里金,双立方等.我不完全知道起点(在问题陈述或Python案例中).
问题定义: 我有MxN矩阵(规则网格),其中每个像素代表一定的测量值(下图和此图中使用的数据在 这里).我想使用我作为蓝色像素的现有数据插入"问号空间"(白色空间,也包括相同大小但空白的像素)区域的数据.

我的问题:
1)如何插入此数据.任何人都可以给我一个简单的例子(例如3x3矩阵)来清楚地理解这一点吗?
2)有人可以指导我如何在Python环境中执行解决方案的步骤吗?
3)如何使用Python比较精度意义上的插值技术?
4)您是否认为根据数据密度使用不同的插值是个好主意?
我将非常感谢您的回答和建议.
rro*_*ndd 43
什么是明智的解决方案在很大程度上取决于您试图用插值像素回答的问题 - 警告:对缺失数据进行外推会导致非常误导性的答案!
径向基函数插值/核平滑
就Python中可用的实用解决方案而言,填充这些像素的一种方法是使用Scipy实现的径向基函数插值(参见此处),该插值用于分散数据的平滑/插值.
给定矩阵M和基础1D坐标数组r和c(如此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)
Run Code Online (Sandbox Code Playgroud)
这会产生以下与上面链接的数据的插值,虽然看起来合理,但是突出显示缺失样本与实际数据的比率是多么不利:

高斯过程回归/克里金法
克里金插值可以通过高斯过程回归实现(它本身基于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)
Run Code Online (Sandbox Code Playgroud)
这产生了与上面的径向基函数示例非常相似的插值.在这两种情况下都需要探索很多参数 - 这些参数的选择很大程度上取决于您可以对数据做出的假设.(上面的RBF示例中使用的线性内核的一个优点是它没有自由参数)

图像修复
作为最后的一点,完全在视觉上有动力的解决方案将使用OpenCV的修复功能,虽然这假设8位数组(0 - 255),并且没有直接的数学解释.
| 归档时间: |
|
| 查看次数: |
12272 次 |
| 最近记录: |