文章目录
- 构建拟合函数
- 数据获取
- 打印信息
光斑处理:python处理高斯光束的图像
光斑处理系统:
- 程序框架🌟打开图像🌟参数对话框/伪彩映射🌟裁切ROI
- 光强分布
构建拟合函数
scipy中提供了非线性最小二乘回归算法,在曲线拟合方面有着不错的表现,所以下面先不考虑UI,创建一个高斯拟合工具,非常简单,如下图所示
from scipy.optimize import curve_fit
def fitGauss(x, y):
gauss = lambda x,a,b,c : a*np.exp(-(x-b)**2/c**2)
abc,para = curve_fit(gauss,x,y)
Y = gauss(x,abc[0],abc[1],abc[2])
info = "fit Model : a*exp(-(x-b)^2/c^2)\n"
info += f"a={abc[0]:3f},b={abc[1]:3f},c={abc[2]:3f}"
info += f"\nfit para:\n{para}"
return Y, info
其中, x , y x,y x,y是用于曲线拟合的数据, Y Y Y是拟合曲线,abc是一个包含 a , b , c a, b, c a,b,c的数组,这三个参数即可组成一个高斯函数
y = a exp [ − ( x − b ) 2 c 2 ] y=a\exp[-\frac{(x-b)^2}{c^2}] y=aexp[−c2(x−b)2]
数据获取
有了拟合函数,接下来只要生成适用于拟合的数据,就可以得到拟合曲线了,为此,暂时对图像按列取最大值,并以此作为待拟合数据。
在完成数据拟合后,需要分别用散点图绘制原始数据,并用曲线图绘制拟合结果,img_fit定义如下。
def img_fit(self):
y = np.max(self.img, 0)
x = np.arange(len(y))
Y, info = fitGauss(x,y)
self.fig.clf()
ax = self.fig.gca()
ax.scatter(x,y,marker='.',label="origin data")
ax.plot(x,Y,lw=1, label="fit data")
ax.legend()
self.canvas.draw()
先点击【裁切】,在弹出对话框中输入【thres】模式,然后点击【拟合】,运行结果如下
打印信息
尽管绘制了数据,但图窗中并没有空间输出具体的拟合参数,所以也无法评价光束的拟合信息。为此,可以创建一个对话框,专门用于打印相关信息,
def showInfo(txt):
root = tk.Tk("help")
root.title("光斑分析工具帮助文件")
text = tk.Text(root)
text.pack(expand=1,fill=tk.BOTH)
text.insert(tk.END,txt)
root.mainloop()
然后再img_fit绘图之后加上一行
showInfo(info)
从而拟合结束之后,就会弹出拟合的参数信息,至此,一个基本的光斑分析工具就算完成了。
fit Model : a*exp(-(x-b)^2/c^2)
a=58.680398,b=27.761098,c=19.362408
fit para:
[[ 0.38468135 -0.0015651 -0.09690099]
[-0.0015651 0.02802167 0.00143946]
[-0.09690099 0.00143946 0.06715842]]