Python光学仿真学习处理高斯光束分布图像

编辑: admin 分类: python 发布时间: 2021-12-03 来源:互联网
目录
  • 通过python处理光斑图像
    • 1 相关包与图像读取
    • 2 图像截取
    • 3显示强度
    • 4数据拟合
  • 问题

    通过python处理光斑图像

    1 相关包与图像读取

    首先需要科学计算必备包numpy和画图包matplotlib.pyplot,我们通过后者进行图像数据的读取.

    plt.imread读取图片之后为数据格式为numpy数组,可以通过成员函数astype将整型数据变成浮点型,有利于后期处理。

    plt.imshowimg的数据加载到窗口,plt.show()显示绘图窗口,默认显示为伪彩图。

    python自动画出了伪彩图,可以通过在plt.imshow的过程中输入cmap参数使之得到灰度图

    >>> plt.imshow(img,cmap=plt.cm.gray)
    <matplotlib.image.AxesImage object at 0x000002E84F5B4788>
    >>> plt.show()
    

    2 图像截取

    由于光斑只占据图片中很小一部分,大量的冗余信息等同于噪声,会对后期的数据处理造成影响,故需截取感兴趣的区域,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()
    

    img/py2.png

    3显示强度

    为了更加直观地反映光斑强度,以图片行列为坐标,可以绘制3d强度图。

    绘制二维曲线,要求输入相应的自变量和因变量,通过点和点的一一对应,画出曲线。三维图像绘制亦然,通过np.meshgrid生成网格坐标,作为其 x , y x,y 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()
    

    结果为

    img/py3.png

    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处理高斯光束分布图像的资料请关注hwidc其它相关文章!

    【文章出处:欧洲服务器