文章目录
- 读取图像
- 截取感兴趣区域
- 强度图
- 拟合
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