web-dev-qa-db-ja.com

Pythonの通常のグリッド上の補間

2Dマトリックスの「空の」ピクセルのデータを統合するのに苦労しています。基本的に、インバースディスタンスウェイト、クリギング、バイキュービックなどの補間手法を理解しています(ただし深くは理解していません)。開始点が正確にわかりません(問題のステートメントまたはPythonの場合)。 。

問題の定義:各ピクセルが特定の測定値(以下の図この図で使用されているデータはここ )。 「クエスチョンマークスペース」(同じサイズで空のピクセルで構成される空白スペース)エリアのデータを、青いピクセルとして持っている既存のデータを使用して補間したかったのです。

Water evaporation in space

私の質問:

1)このデータをどのように補間できますか?誰かがそれを明確に理解するための簡単な例(3x3マトリックスなど)を教えてもらえますか?

2)Python環境での解決策に向けたステップを実行する方法を誰かが私に案内してくれませんか?

3)Pythonを使用して精度の意味で補間技術を比較するにはどうすればよいですか?

4)データの密度に応じて異なる補間を使用することは良い考えだと思いますか?

私はあなたの答えと提案に感謝します。

23
Spider

賢明な解決策は何であるかは、補間されたピクセルで答えようとしている質問に大きく依存します-空の注意:欠落しているデータを外挿すると、非常に誤解を招く可能性があります!

動径基底関数補間/カーネル平滑化

Pythonで利用できる実用的なソリューションの観点から、これらのピクセルを埋める1つの方法は、Scipyの放射基底関数補間の実装を使用することです( here を参照)。これは、散乱データの平滑化/補間を目的としています。

行列Mと基礎となる1D座標配列rおよびcM.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)

これにより、上記にリンクした次のデータの補間が得られます。これは見た目は妥当ですが、欠落しているサンプルと実際のデータの比率がどれほど好ましくないかを示しています。

RBF Interpolation

ガウス過程回帰/クリギング

クリギング補間は、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つの利点は、自由なパラメーターがないことです)

Kriging/Gaussian Process Regression

インペインティング

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

43
rroowwllaanndd