具有最大插值距离的numpy数组插值

Interpolation of numpy array with a maximum interpolation distance

我有一个像这样的 numpy 数组。

我想在数据点之间进行插值以填充数据中的一些较小的空洞。假设在这个例子中我想插值最多 2 个像素。然后我会期待类似的东西。

到目前为止,我已经尝试了几种插值方法,例如:

from scipy.interpolate import LinearNDInterpolator
valid_mask = ~np.isnan(raw)
coords = np.array(np.nonzero(valid_mask)).T
values = raw[valid_mask]
it = LinearNDInterpolator(coords, values)
interpolated = it(list(np.ndindex(raw.shape))).reshape(raw.shape)

这导致了结果。

这种方法不会保留数据中的聚类,我可以通过预先聚类然后添加结果来轻松克服这一点。但更重要的是,它在具有 形式的簇中进行远距离插值。

谁能给我指出一种使用某种距离阈值的插值方法?

为了测试,我包含了用于解释我的问题的示例数据:

raw = np.array([[ 0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.],
   [ 0.,  1.,  0.,  0.,  3.,  0.,  0.,  0.],
   [ 0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.],
   [ 0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.],
   [ 0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.],
   [ 0.,  5.,  4.,  4.,  4.,  4.,  4.,  5.],
   [ 0.,  5.,  0.,  0.,  0.,  0.,  0.,  0.],
   [ 0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.],
   [ 0.,  0.,  1.,  0.,  0.,  0.,  0.,  0.],
   [ 0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.]])

raw[raw==0]=np.nan

您可以执行 binary_closing(例如,从 skimage.morphology or scipy.ndimage.morphology)来屏蔽您的最终输出。

from skimage import morphology
close_mask = morphology.binary_closing(valid_mask, morphology.square(3))
interpolated[:] = np.where(close_mask, interpolated, np.nan)

结果:

array([[    nan,     nan,     nan,     nan,     nan,     nan,     nan,     nan],
       [    nan,  1.    ,  1.6667,  2.3333,  3.    ,     nan,     nan,     nan],
       [    nan,     nan,     nan,     nan,     nan,     nan,     nan,     nan],
       [    nan,     nan,     nan,     nan,     nan,     nan,     nan,     nan],
       [    nan,     nan,     nan,     nan,     nan,     nan,     nan,     nan],
       [    nan,  5.    ,  4.    ,  4.    ,  4.    , 4.     ,  4.    ,     nan],
       [    nan,  5.    ,  3.    ,     nan,     nan,     nan,     nan,     nan],
       [    nan,     nan,  2.    ,     nan,     nan,     nan,     nan,     nan],
       [    nan,     nan,  1.    ,     nan,     nan,     nan,     nan,     nan],
       [    nan,     nan,     nan,     nan,     nan,     nan,     nan,     nan]])

更改内核大小和形状以获得您想要的;有几个可用,或者您可以自己制作。显然这不是非常有效,因为它进行了整个插值但只保留了你想要的部分。我不确定如何首先限制计算的位置。

还有,好像是杀界线(见第5行)。我想这可以解决。