使图像适合2D高斯,并猜测质心?

时间:2018-08-10 22:37:57

标签: python arrays python-3.x gaussian data-fitting

我正在尝试将2D numpy数组(图像)适合Python中的高斯。图像中可能有多个强度源,但我想要的是靠近几何中心的一个。因此,我希望在对阵列中间部分进行“猜测”的同时进行拟合。我怎样才能做到这一点?到目前为止,这是我所拥有的(我对曲线拟合的其他事情也感到困惑;请参见下文):

import numpy as np
from scipy import optimize

def Gaussian_2D(x, y, x_0, y_0, theta, sigma_x, sigma_y, amp):
    a = np.cos(theta)**2/(2*sigma_x**2) + np.sin(theta)**2/(2*sigma_y**2)
    b = -np.sin(2*theta)/(4*sigma_x**2) + np.sin(2*theta)/(4*sigma_y**2)
    c = np.sin(theta)**2/(2*sigma_x**2) + np.cos(theta)**2/(2*sigma_y**2)
    exp_term = a * (x-x_0)**2
    exp_term += 2*b*(x-x_0)*(y-y_0)
    exp_term += c * (y-y_0)**2
    return amp * np.exp(-exp_term)

def fit_to_model(data):
    xdata = np.arange(0, np.shape(data)[1], 1)
    ydata = np.arange(0, np.shape(data)[0], 1)
    geom_middle = (np.shape(data)[0]//2, np.shape(data)[1]//2)
    p0 = geom_middle #guess

    fit = optimize.curve_fit(Gaussian_2D(xdata, ydata, geom_middle[1], geom_middle[0], 0, np.std(data), np.std(data), amp), xdata, ydata p0)
    return fit

data是2D数组。不过,我不确定用什么代替振幅,因为我实际上还不知道光源的振幅(我想使用高斯拟合来找出其振幅和实际位置)。我也不知道我是否正确定义了xdataydatasigma,因为在我的数组中每个维度上可能存在不同的标准偏差,并且{ {1}}沿轴返回一个数组。感谢您的帮助-谢谢!

0 个答案:

没有答案