簡體   English   中英

具有最大插值距離的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.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行)。 我想這可以解決。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM