[英]Interpolation of numpy array with a maximum interpolation distance
我想在數據點之間進行插值以填充數據中的一些小孔。 假設在此示例中,我想插值最多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行)。 我想這可以解決。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.