Python光学仿真:高斯光束图像读取、截取与拟合分析

陈默
陈默
发布时间:2026-10-15 | 5人浏览过
原创

本文详解使用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处理高斯光束图像的相关资料,敬请关注本站其他技术文章。

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表