何が賢明な解決策であるかは、補間されたピクセルでどのような質問に答えようとしているかによって大きく異なります。
放射基底関数補間 / カーネル スムージング
Python で利用可能な実用的なソリューションに関しては、それらのピクセルを埋める 1 つの方法は、分散データの平滑化/補間を目的とした放射基底関数補間 (こちらを参照) の Scipy の実装を使用することです。
行列M
と基礎となる 1D 座標配列r
およびc
(そのようなM.shape == (r.size, c.size)
) が与えられ、M の欠落エントリが に設定されているnan
場合、これは次のように線形 RBF カーネルでかなりうまく機能するようです。
import numpy as np
import scipy.interpolate as interpolate
with open('measurement.txt') as fh:
M = np.vstack(map(float, r.split(' ')) for r in fh.read().splitlines())
r = np.linspace(0, 1, M.shape[0])
c = np.linspace(0, 1, M.shape[1])
rr, cc = np.meshgrid(r, c)
vals = ~np.isnan(M)
f = interpolate.Rbf(rr[vals], cc[vals], M[vals], function='linear')
interpolated = f(rr, cc)
これにより、上記でリンクしたデータの次の補間が得られます。見た目は合理的ですが、実際のデータに対する欠損サンプルの比率がいかに好ましくないかを強調しています。

ガウス過程回帰/クリギング
クリギング補間は、scikit-learn ライブラリのGaussian Process Regression実装 (Matlab の DACE クリギング ツールボックスに基づいています) を介して利用できます。これは、次のように呼び出すことができます。
from sklearn.gaussian_process import GaussianProcess
gp = GaussianProcess(theta0=0.1, thetaL=.001, thetaU=1., nugget=0.01)
gp.fit(X=np.column_stack([rr[vals],cc[vals]]), y=M[vals])
rr_cc_as_cols = np.column_stack([rr.flatten(), cc.flatten()])
interpolated = gp.predict(rr_cc_as_cols).reshape(M.shape)
これにより、上記の放射基底関数の例と非常によく似た補間が得られます。どちらの場合も、検討すべきパラメータが多数あります。これらの選択は、主に、データについて行うことができる仮定に左右されます。(上記の RBF の例で使用されている線形カーネルの利点の 1 つは、自由なパラメーターがないことです)

修復
最後に、完全に視覚的に動機付けられたソリューションは、OpenCV の修復機能を使用することですが、これは 8 ビット配列 (0 ~ 255) を想定しており、単純な数学的解釈はありません。