python - numpy数组的插值最大插值距离

标签 python image numpy scipy interpolation

我有一个看起来像这样的 numpy 数组。 Raw data

我想在数据点之间进行插值以填充数据中的一些较小的漏洞。假设在此示例中我想对最多 2 个像素进行插值。然后我会期待类似的事情。 Expected result

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

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)

这导致了结果。 Interpolated

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

有人可以向我指出一种使用某种距离阈值的插值方法吗?

为了进行测试,我添加了用于解释问题的示例数据:

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_looking (例如,从 skimage.morphologyscipy.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 行)。我想这个问题可以解决。

关于python - numpy数组的插值最大插值距离,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32272004/

相关文章:

javascript - 如何异步加载图像?

python - matplotlib 中的对数颜色图

python - 将值 append 到 3D 数组 numpy

python - 按列名称选择文本文件中的特定列并提取其内容

python - 在python中通过正则表达式提取Alberta(加拿大)邮政编码

python - 将 CNN 模型转化为类

python - 有条件地将某些行值复制到其他行

python - 我如何将 DataFrame 中的值 'squash' 我知道每行只有一个项目放入系列中?

php - 如何将数据库中的图像调成每行10张图像?

android - 是否有使用 Android Studio 添加不是图标的可绘制对象的内置方法?