Excel+VBA处理高斯光束

2024-02-09 09:28
文章标签 excel 处理 高斯 vba 光束

本文主要是介绍Excel+VBA处理高斯光束,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

文章目录

    • 1 图片导入与裁剪
    • 2 获取图片数据
    • 3 数据拟合

1 图片导入与裁剪

插入图片没什么好说的,新建Excel,【插入】->【图片】。

由于图像比较大,所以要对数据进行截取,选中图片之后,点击选项卡右端的【图片格式】->【裁剪】,将光斑所在区域截取出来,如图所示

在这里插入图片描述

由于灰度图像在观感上比较单一,故可以通过重新着色的方法,为其添加伪彩色。

首先,复制一张图片,点击【图像格式】->【颜色】->【重新着色】;或者在【颜色】下选择其他变体,

在这里插入图片描述

然后将图片导出,由于Excel功能的限制,我们没法直接导出图片,所以将图片复制到PPT中,然后右键【图片】->【另存为图片】。为了便于后续的处理,保存为【bmp】格式。

2 获取图片数据

在选中图片的值之后,就可以提取图片中的数据了,我们需要用到VBA工具。如果初次使用,选择【文件】->【选项】->【自定义功能区】->选中开发工具。

添加之后,在菜单栏选择【开发工具】->【插入】->【按钮】,从而插入一个按钮,右键按钮->【编辑文字】,更名为【加载数据】。

然后右键按钮->【指定宏】,在弹出的对话框中添入【Load_Click】,然后点击【新建】,便可到达VBA编辑界面。并且已经写好了

Sub Load_Click()
End Sub

接下来我们就开始编写图片的编辑方法。

BMP文件包括三个部分,分别是文件头、颜色映射表和图片数据,其中文件头总计54位,存储着图片的格式宽高等信息;而数据区则根据图片的深度以及颜色信息对像素的值进行存储。

尽管我们拍摄的图像是灰度图,但经过PPT的重新存储,变成了24位的RGB图像,我们只需选择其中的一个通道即可。

VBA中通过单引号'进行注释。

Sub Load_Click()Const file As String = "E:\Pictures\Facula1.bmp"Dim bytes() As ByteDim width, height, stride As Long   '分别位图像的宽,, 偏移'获取bmp图片二进制数组Open file For Binary As #1 '#1表示文件编号ReDim bytes(LOF(1) - 1)      '重新定义bytes的长度Get #1, , bytes              '将文件1的内容写入bytesClose #1For i = 0 To 3start = start + bytes(i + 10) * 256 ^ iwidth = width + bytes(i + 18) * 256 ^ i     'bitmap中第18-21位为列数height = height + bytes(i + 22) * 256 ^ i   'bitmap中第22-25位为行数Nextstride = width * 3 + 2If (stride Mod 4) <> 0 Thenstride = stride - (stride Mod 4) + 4       'bitmap格式每行必须是4的倍数End IfCells.ClearFor i = 1 To heightFor j = 1 To widthpos = start + (j-1) * 3 + (i - 1) * strideCells(i, j).Value = bytes(pos)      '将像素的灰度值赋给单元格NextNext
End Sub

点击【加载数据】按钮,就可以看图像的数据被加载到单元格中。

若将赋值语句Cells(i, j).Value = bytes(pos)变成颜色变化,则可以通过单元格复现图像。

'...For i = 1 To heightFor j = 1 To widthpos = start + (j-1) * 3 + (i - 1) * stride'将单元格的颜色变为图像的颜色Cells(i, j).Interior.Color = RGB(bytes(pos + 2), bytes(pos + 1), bytes(pos))NextNext

点击加载数据,就可以看到如下情景

在这里插入图片描述

3 数据拟合

当我们得到图像中的数据之后,需要对每一行的最大值进行提取。将鼠标定位到第一行数据的最后一列GH,在新的一列GI中输入=MAX(A1:GH1),从而从第一行的所有数据中求得最大值。

然后将鼠标放到刚刚操作的单元格的右下方,当鼠标变成黑色十字的时候双击,即可对这一列进行最大值操作。

得到最大值之后,将这一列的数据复制到新的sheet中,粘贴时如果出现错误,需选择右下角出现的复制选项,并选择粘贴数值。

选中这一列,点击【插入】->【推荐的图表】,从而得到光强分布的散点图,双击图表标题即可对其进行更改。

在这里插入图片描述

在Excel中,提供了初级的数据拟合功能,点击图像右上角的加号,会出现一系列图表元素,最底端即趋势线,鼠标浮动其上,右侧出现一个三角形,点击之后选择最下面的更多选项

可以看到Excel中提供了指数、对数、线性、多项式以及移动平均等多种拟合曲线,可惜并没有我们需要的Gauss函数。

y = a ⋅ exp ⁡ ( − ( x − b c ) 2 ​ ) y=a⋅\exp{(−(\frac{x−b}{c})^2​)} y=aexp((cxb)2)

其中,a的值表示该函数的最大值;b表示其中心值,c表示当y值降到 1 e 2 \frac{1}{e^2} e21分之一处时x距离中心的位置。

然而,我们可以通过对原始数据进行简单的变换

ln ⁡ y = ln ⁡ a − ( x − b ) 2 c 2 ln ⁡ y = − x 2 c 2 + 2 b x c 2 + ln ⁡ a − b 2 c 2 \begin{aligned} \ln y&=\ln a-\frac{(x-b)^2}{c^2}\\ \ln y&=-\frac{x^2}{c^2}+\frac{2bx}{c^2}+\ln a-\frac{b^2}{c^2} \end{aligned} lnylny=lnac2(xb)2=c2x2+c22bx+lnac2b2

Y = ln ⁡ y , A = − 1 c 2 , B = 2 b c 2 , C = ln ⁡ a − b 2 c 2 Y=\ln y, A=-\frac{1}{c^2}, B = \frac{2b}{c^2}, C=\ln a-\frac{b^2}{c^2} Y=lny,A=c21,B=c22b,C=lnac2b2,则Gauss函数变为

Y = A x 2 + B x + C Y=Ax^2+Bx+C Y=Ax2+Bx+C

待拟合成功后,有 c = 1 − A , b = − B 2 A , a = exp ⁡ 4 A C − B 2 4 A c=\frac{1}{\sqrt{-A}},b=-\frac{B}{2A},a=\exp\frac{4AC-B^2}{4A} c=A 1,b=2AB,a=exp4A4ACB2

从而就可以进行多项式拟合了。

所以,首先在【B1】单元格中输入【=LN(A1)】,然后按照刚才的方法,将鼠标放置在单元格的右下角,待其变为黑色十字后双击,从而新建一列数据。

随后,对新建的数据仍然插入推荐的图表,并添加趋势线,然后在趋势线设置栏选中显示公式

在这里插入图片描述

可见,由于存在大量光斑之外的数据,所以拟合效果并不好,所以需要对数据重新选择

在这里插入图片描述

在弹出的选择数据源窗口,重设图表数据区域。在本例中,将其设为=Sheet2!$B$50:$B$130。其中Sheet2为本sheet的名字,$B$50:$B$130表示B列第50行到B列第130行。

在这里插入图片描述

可见拟合效果好了很多,其中 A = − 0.0021 A=-0.0021 A=0.0021 B = 0.1567 B=0.1567 B=0.1567 c = 1.5589 c=1.5589 c=1.5589

根据 c = 1 − A , b = − B 2 A , a = exp ⁡ 4 A C − B 2 4 A c=\frac{1}{\sqrt{-A}},b=-\frac{B}{2A},a=\exp\frac{4AC-B^2}{4A} c=A 1,b=2AB,a=exp4A4ACB2,可新开一个sheet,并在其中输入公式

AB
1-0.0021=1/SQRT(-A1)
20.1567=-A2/A1/2
31.5589=EXP((4*A1*A3-A2^2)/A1/4)

从而计算出c=21.82, b=37.31, a=88.42,但需要注意的是,我们刚刚在选取数据的时候,是从50开始的,所以b=50+37.31=87.31

这篇关于Excel+VBA处理高斯光束的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/693822

相关文章

Python FastAPI+Celery+RabbitMQ实现分布式图片水印处理系统

《PythonFastAPI+Celery+RabbitMQ实现分布式图片水印处理系统》这篇文章主要为大家详细介绍了PythonFastAPI如何结合Celery以及RabbitMQ实现简单的分布式... 实现思路FastAPI 服务器Celery 任务队列RabbitMQ 作为消息代理定时任务处理完整

C#使用SQLite进行大数据量高效处理的代码示例

《C#使用SQLite进行大数据量高效处理的代码示例》在软件开发中,高效处理大数据量是一个常见且具有挑战性的任务,SQLite因其零配置、嵌入式、跨平台的特性,成为许多开发者的首选数据库,本文将深入探... 目录前言准备工作数据实体核心技术批量插入:从乌龟到猎豹的蜕变分页查询:加载百万数据异步处理:拒绝界面

Springboot处理跨域的实现方式(附Demo)

《Springboot处理跨域的实现方式(附Demo)》:本文主要介绍Springboot处理跨域的实现方式(附Demo),具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不... 目录Springboot处理跨域的方式1. 基本知识2. @CrossOrigin3. 全局跨域设置4.

java中使用POI生成Excel并导出过程

《java中使用POI生成Excel并导出过程》:本文主要介绍java中使用POI生成Excel并导出过程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录需求说明及实现方式需求完成通用代码版本1版本2结果展示type参数为atype参数为b总结注:本文章中代码均为

python+opencv处理颜色之将目标颜色转换实例代码

《python+opencv处理颜色之将目标颜色转换实例代码》OpenCV是一个的跨平台计算机视觉库,可以运行在Linux、Windows和MacOS操作系统上,:本文主要介绍python+ope... 目录下面是代码+ 效果 + 解释转HSV: 关于颜色总是要转HSV的掩膜再标注总结 目标:将红色的部分滤

Python实现自动化接收与处理手机验证码

《Python实现自动化接收与处理手机验证码》在移动互联网时代,短信验证码已成为身份验证、账号注册等环节的重要安全手段,本文将介绍如何利用Python实现验证码的自动接收,识别与转发,需要的可以参考下... 目录引言一、准备工作1.1 硬件与软件需求1.2 环境配置二、核心功能实现2.1 短信监听与获取2.

利用Python开发Markdown表格结构转换为Excel工具

《利用Python开发Markdown表格结构转换为Excel工具》在数据管理和文档编写过程中,我们经常使用Markdown来记录表格数据,但它没有Excel使用方便,所以本文将使用Python编写一... 目录1.完整代码2. 项目概述3. 代码解析3.1 依赖库3.2 GUI 设计3.3 解析 Mark

Python使用date模块进行日期处理的终极指南

《Python使用date模块进行日期处理的终极指南》在处理与时间相关的数据时,Python的date模块是开发者最趁手的工具之一,本文将用通俗的语言,结合真实案例,带您掌握date模块的六大核心功能... 目录引言一、date模块的核心功能1.1 日期表示1.2 日期计算1.3 日期比较二、六大常用方法详

利用Go语言开发文件操作工具轻松处理所有文件

《利用Go语言开发文件操作工具轻松处理所有文件》在后端开发中,文件操作是一个非常常见但又容易出错的场景,本文小编要向大家介绍一个强大的Go语言文件操作工具库,它能帮你轻松处理各种文件操作场景... 目录为什么需要这个工具?核心功能详解1. 文件/目录存javascript在性检查2. 批量创建目录3. 文件

Java使用多线程处理未知任务数的方案介绍

《Java使用多线程处理未知任务数的方案介绍》这篇文章主要为大家详细介绍了Java如何使用多线程实现处理未知任务数,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 知道任务个数,你可以定义好线程数规则,生成线程数去跑代码说明:1.虚拟线程池:使用 Executors.newVir