如何获得2D高斯拟合的正确参数以拟合具有噪声的图像

时间:2018-08-09 23:21:49

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

我有多个对象的图像,其中感兴趣的对象(每个图像一个)在所述图像的中心附近。但是,它不一定是图像中最亮的光源,因为某些图像还包含我不感兴趣的光源,但它们恰好更亮/更强烈。通常还会有大量的噪音。

我想让高斯人适合这些2D numpy图像阵列,但是不确定如何使用这些我不需要的明亮光源有效地做到这一点。最后,我将所有图像(中值)以感兴趣的源为中心进行堆叠,因此这些其他明亮的源将消失。下面是到目前为止我尝试过的代码,其中data是多个2D数组(图像)的列表。

import numpy as np
import scipy

def Gaussian2D(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 GaussianFit(data):
    for data_set in data:
        y_0, x_0 = (np.shape(data_set)[0]//2, np.shape(data_set)[1]//2)
        sigma_x, sigma_y = np.std(data_set, axis=1), np.std(data_set, axis=0)
        fit = scipy.optimize.curve_fit(Gaussian2D(x, y, x_0, y_0, 0, sigma_x, sigma_y, amp), data_set)
    return fit

我从未在代码中完成函数拟合,所以我感到非常迷茫。我的具体问题是:

  1. 如何正确定义参数?我是否需要按数组展平以获取sigma参数?另外,我在一些示例代码中注意到,人们使用x制作了ylinspace数组,所以我不确定是否需要这样做,并且我也不知道振幅要输入什么。

  2. 我该如何处理每个图像有多个明亮光源,而只想适合最靠近中心的一个光源这一事实呢?我可以以某种方式指定要在图像中心附近看吗?

  3. 拟合后,我还将需要中心源的坐标。我该怎么做才能确保它不会给我其他来源的坐标?

任何其他帮助或建议也将受到赞赏。谢谢!

1 个答案:

答案 0 :(得分:1)

您可以使用Gaussian Mixture Model进行此操作。我认为SciPy中没有功能,但是scikit-learn

中有一个功能

Here是关于此的教程。

(根据我对this问题的回答)

然后只需从图像中删除不需要的分布并适合它即可。

或者有skimage's blob detection

在拟合2d高斯时,请阅读here。要使用它,您必须将数组展平,因为scipy's curve_fit仅需要一个1d数组。但是效果很好。

here描述了另一种方法。使用已经具有三个高斯函数的拟合函数。如果您知道图像上总是有三个(或者在您的情况下为两个)峰,这将起作用。