我有多个对象的图像,其中感兴趣的对象(每个图像一个)在所述图像的中心附近。但是,它不一定是图像中最亮的光源,因为某些图像还包含我不感兴趣的光源,但它们恰好更亮/更强烈。通常还会有大量的噪音。
我想让高斯人适合这些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
我从未在代码中完成函数拟合,所以我感到非常迷茫。我的具体问题是:
如何正确定义参数?我是否需要按数组展平以获取sigma
参数?另外,我在一些示例代码中注意到,人们使用x
制作了y
和linspace
数组,所以我不确定是否需要这样做,并且我也不知道振幅要输入什么。
我该如何处理每个图像有多个明亮光源,而只想适合最靠近中心的一个光源这一事实呢?我可以以某种方式指定要在图像中心附近看吗?
拟合后,我还将需要中心源的坐标。我该怎么做才能确保它不会给我其他来源的坐标?
任何其他帮助或建议也将受到赞赏。谢谢!
答案 0 :(得分:1)
您可以使用Gaussian Mixture Model进行此操作。我认为SciPy中没有功能,但是scikit-learn
中有一个功能Here是关于此的教程。
(根据我对this问题的回答)
然后只需从图像中删除不需要的分布并适合它即可。
在拟合2d高斯时,请阅读here。要使用它,您必须将数组展平,因为scipy's curve_fit仅需要一个1d数组。但是效果很好。
here描述了另一种方法。使用已经具有三个高斯函数的拟合函数。如果您知道图像上总是有三个(或者在您的情况下为两个)峰,这将起作用。