1 つの 2D 配列によって与えられるグレースケール画像データに 2D-Gaussian を当てはめようとしています。lmfit ライブラリは、これを実行できる使いやすい Model クラスを実装しています。残念ながら、ドキュメント ( http://lmfit.github.io/lmfit-py/model.html ) は 1D フィッティングの例しか提供していません。私の場合、2 つの独立変数を使用して lmfit モデルを構築するだけです。
次のコードは私には有効に思えますが、scipy が「minpack.error: 関数呼び出しの結果は浮動小数点数の適切な配列ではありません」をスローします。
トムはそれを要約します: 2D (x1,x2)->(y) データを lmfit のモデルに入力する方法.?
これが私のアプローチです。すべてが GaussianFit2D クラスにパックされていますが、重要な部分は次のとおりです。それがガウス関数です。ドキュメントには、ユーザー定義関数について書かれています
もちろん、モデル関数は、モデル化されているデータと同じサイズの配列を返す必要があります。通常、これは 1 つ以上の独立変数も指定することによって処理されます。
与えられた値 x1,x2 に対して唯一の合理的な結果はスカラー値であるため、これが何を意味するのか実際にはわかりません。
def _function(self, x1, x2, amp, wid, cen1, cen2):
val = (amp/(np.sqrt(2*np.pi)*wid)) * np.exp(-((x1-cen1)**2+(x2-cen2)**2)/(2*wid**2))
return val
ここでモデルが生成されます。
def _buildModel(self, **kwargs):
model = lmfit.Model(self._function, independent_vars=["x1", "x2"],
param_names=["amp", "wid", "cen1", "cen2"])
return model
これは、データを受け取り、モデルとパラメーターを構築し、lmfit fit() を呼び出す関数です。
def fit(self, data, freeX, **kwargs):
freeX = np.asarray(freeX, float)
model = self._buildModel(**kwargs)
params = self._generateModelParams(model, **kwargs)
model.fit(data, x1=freeX[0], x2=freeX[1], params=params)
Anf 最後に、この fit 関数が呼び出されます。
data = np.asarray(img, float)
gaussFit = GaussianFit2D()
x1 = np.arange(len(img[0, :]))
x2 = np.arange(len(img[:, 0]))
fit = gaussFit.fit(data, [x1, x2])