我有一个看起来像这样的 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
或 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 行)。我想这可以解决。
我是一名优秀的程序员,十分优秀!