Octave处理高斯光束

2024-01-01 10:03:36

Octave是一种开源的数值计算软件,主要用于科学计算、数据分析和数值模拟等领域。既提供了一个用户友好的命令行界面,使用户能够通过输入简单的命令来进行各种数学运算和数据操作。也提供了功能完备的GUI窗口,可以时刻监控变量。因其与Matlab相似的语法和功能,因此也被视为Matlab的开源替代品。

用不同的语言和工具处理高斯光束:
Python?R语言?Julia?Mathemetica?C#?Excel+VBA?ImageJ?Octave

读取图像

Octave与Matlab有着几乎完全相同的语法,堪称Matlab的最佳开源替代。其图像处理方法也与Matlab如出一辙,首先,通过imread打开图像。

Octave界面上方会显示当前目录,若图像在当前目录中,可使用相对路径;否则需要使用绝对路径。

img = imread('test.bmp');%通过相对路径读取图片
img = imread('D:\Code\optics\img\test.bmp');%通过绝对路径读取图片
size(img)
%ans =
%        1024        1280
imshow(img)

下图是Octave的绘图窗口。

在这里插入图片描述

截取感兴趣区域

上图中存在大量的无用信息,目标光斑仅占据很小的一片区域,故需对图像进行截取,首先通过函数ginput选择截取区域。ginput操作的是最后被打开而未被关闭的窗口对象,其输入参数为将要选取的点的个数,在这里我们选择两个点将目标区域框起来,其返回值为选取点的横纵坐标。

和Matlab不同,如果不明确其输出变量X,Y,Btn,那么返回值将只显示第一项,即X。

imshow(img)
[X,Y,Btn] = ginput(2)
%X =
%   353.24
%   434.34
%Y =
%   178.93
%   265.93
%Btn =
%   1
%   1

接下来通过矩阵选取的方式,选择感兴趣的区域,需要注意的是,截取图像时行在前,列在后,而x代表列数,y代表行数。截取之后的图片如下图所示

roi = img(178:265, 353:434);
imshow(roi)

在这里插入图片描述

强度图

灰度图并不直观,相比之下,3D网格图可以更加直观地表现光斑的强度信息,mesh函数可以做到这一点

mesh(roi)

通过view函数,可调整网格图的视角,例如,[0 0 1]表示俯视图

view([0 0 1])

二者效果如下

默认视图view([0 0 1])
在这里插入图片描述在这里插入图片描述

拟合

高斯光束之所以被冠以高斯之名,乃因其在空间中强度呈现出高斯分布,所以接下来就要通过高斯函数对齐进行拟合。然而作为二维数据的图像,在拟合时并不直观,故此可从每一行选出最大值作为单一坐标下的强度,然后再行数据拟合。

arr = max(roi);
arr = double(arr);      %将其转为浮点型
x = 1:length(arr)*1.0;	%创建x坐标
plot(arr)

效果如下

在这里插入图片描述

Octave中并没有内置可视化的数据拟合工具,但开源软件的优势就是,有着无数开发者为其提供新的功能,比如一位瑞士老哥就开发了一款非线性

进入他的主页andreasstahel,点击Octave/Matlab,找到FitToolNL.m并下载。然后在当前Octave窗口,点击文件->打开,以打开FitToolNL.m文件,然后点击绿色三角号运行。输入参数即运行结果如下图所示

在这里插入图片描述

其中, x , y x,y x,y是待拟合变量,右侧function为拟合函数类型, p 0 p_0 p0?为初始参数,60差不多是下面曲线的最大值,40差不多是其峰值所在位置。

左下角为拟合结果,得到高斯函数为

57.9767 exp ? ? ( x ? 38.7699 14.1044 ) 2 57.9767\exp -(\frac{x-38.7699}{14.1044})^2 57.9767exp?(14.1044x?38.7699?)2

文章来源:https://blog.csdn.net/m0_37816922/article/details/135179639
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。