Python光学仿真:高斯光束图像读取、截取与拟合分析
本文详解使用Python进行光学仿真中处理高斯光束分布图像的全过程。涵盖利用numpy和matplotlib读取及转换图像数据,通过交互方式截取感兴趣区域(ROI)以去除噪声。进一步展示如何绘制3D强度分布图,并提取径向最大值进行降维。最后,利用scipy.optimize.curve_fit函数对数据进行高斯拟合,获取光束参数并评估拟合效果,为光学实验数据分析提供完整代码示例。
利用Python技术处理光斑分布图像
1 相关包与图像读取
首先需导入科学计算核心库numpy以及绘图库matplotlib.pyplot,借助后者完成图像数据的读取操作。
调用plt.imread读取图片后,获取的数据格式为numpy数组。可通过成员函数astype将整型数据转换为浮点型,以便后续进行更精确的数值处理。
使用plt.imshow将img数据加载至显示窗口,并调用plt.show()展示绘图窗口,默认情况下以伪彩色图像形式呈现。
Python自动生成的伪彩色图,若在plt.imshow调用过程中传入cmap参数,则可将其转换为灰度图像显示。
>>> plt.imshow(img,cmap=plt.cm.gray)
<matplotlib.image.AxesImage object at 0x000002E84F5B4788>
>>> plt.show()
2 图像截取
由于光斑仅占据图像的一小部分,大量冗余信息相当于噪声,可能干扰后续数据处理,因此需要截取感兴趣区域(ROI)。plt.ginput函数提供了一种交互式的操作方式,可返回鼠标点击的位置坐标,其输入参数指定选取点的数量,输出为各点击点的坐标值。
>>> plt.imshow(img)
<matplotlib.image.AxesImage object at 0x000002E857A21448>
>>> plt.ginput(2)
[(717.0757575757577, 299.8290043290042), (783.5692640692644, 233.33549783549768)]
在Python中,利用方括号进行矩阵索引来实现图片截取,具体方法如下所示。
>>> roi = img[233:299,717:783]
>>> plt.imshow(roi)
<matplotlib.image.AxesImage object at 0x000002E84F5B4948>
>>> plt.show()

3 显示强度
为了更直观地反映光斑的强度分布,可以以图片的行号和列号作为坐标轴,绘制3D强度分布图。
绘制二维曲线需输入相应的自变量和因变量,通过点与点的一一对应关系绘制曲线。三维图像的绘制同理,通过np.meshgrid生成网格坐标,作为x和y方向的自变量。该函数输入两个一维数组,返回两个二维数组,用于表示这两个方向上的坐标网格。
>>> xNum,yNum = roi.shape #获取roi的维度
>>> xAxis,yAxis = np.meshgrid(range(yNum),range(xNum)) #range创建长度为xNum的自然数列
>>> ax = plt.gca(projection='3d') #建立3D坐标轴
>>> ax.plot_surface(xAxis,yAxis,roi) #创建面元图
<mpl_toolkits.mplot3d.art3d.Poly3DCollection object at 0x0000019EAFF19D48>
>>> plt.show()
最终生成的3D图像结果如图所示。

4 数据拟合
光斑在空间中的分布呈现中心对称特征,因此可抽取其径向坐标进行降维处理。考虑到数据的稳定性并排除非信号区域的影响,可以提取每一列的最大值作为代表数据。
>>> arr = np.max(roi,0)
>>> x = np.arange(len(arr))
>>> plt.plot(x,arr)
[<matplotlib.lines.Line2D object at 0x0000019EB469EB48>]
>>> plt.show()
处理结果如图所示。

在Python中,需引入科学计算库scipy中的优化拟合模块optimize,并使用其中的curve_fit函数执行数据的高斯拟合。curve_fit函数的输入参数包括拟合函数、自变量数组和因变量数组;输出参数包含拟合函数中的其他参数以及拟合质量的评价指标。
其中,高斯函数的数学表达形式为:

>>> from scipy.optimize import curve_fit
>>> def gauss(x, a, b, c):
... return a*np.exp(-(x-b)**2/c**2)
...
>>> abc, para = curve_fit(gauss,x,arr)
>>> abc #即上式中的a,b,c
array([89.72326971, 35.58522403, 20.86186403])
>>> fitValue = gauss(x,abc[0],abc[1],abc[2]) #拟合值
>>> plt.scatter(x,arr) #绘制原始数据的散点图
<matplotlib.collections.PathCollection object at 0x0000019EB5438D88>
>>> plt.plot(x,fitValue) #绘制拟合数据的曲线图
[<matplotlib.lines.Line2D object at 0x0000019EB46D4048>]
>>> plt.show()

问题
若相关库未安装,可通过命令行使用pip工具进行安装。
> pip install numpy
> pip install matplotlib
> pip install scipy
以上为Python光学仿真中处理高斯光束分布图像的完整流程,更多Python处理高斯光束图像的相关资料,敬请关注本站其他技术文章。
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













