You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用gnuplot将3D高斯函数拟合到tiff/png激光光束图像?

用gnuplot拟合激光光束图像的3D高斯函数完整步骤

你猜的没错,gnuplot的fit命令无法直接处理图像二进制文件,必须先把图像转换成包含坐标与强度值的文本数据文件,以下是具体操作流程:

1. 图像转文本数据

用ImageMagick的convert工具将图像转为文本格式(几乎所有Linux/macOS都预装,Windows可单独安装):

  • 先转灰度图(激光光束一般用单通道灰度图拟合更准确):
    convert testpicture.png -colorspace Gray testpicture_gray.png
    
  • 再转成包含坐标与灰度值的文本文件:
    convert testpicture_gray.png -depth 8 testpicture.txt
    
    -depth 8指定用8位灰度值(0-255),输出的testpicture.txt每行格式类似x,y: (R,G,B,A)(灰度图中R=G=B)。

2. 提取拟合用的三列数据

用awk提取x坐标、y坐标、灰度强度值,生成data.dat:

awk '{split($0,a,/[:,() ]/); print a[2],a[3],a[5]}' testpicture.txt > data.dat

最终data.dat是三列结构:x y 强度值,符合gnuplot拟合要求。

3. 修正3D高斯函数(你的原函数有语法错误)

原函数存在括号不闭合问题,修正后:

f(x,y) = a/(sigmax*sigmay*2*pi) * exp( -((x-mux)**2/(2*sigmax**2) + (y-muy)**2/(2*sigmay**2)) ) + b
  • a:控制峰值高度;b:背景强度;sigmax/sigmay:x/y方向光斑宽度;mux/muy:光斑中心坐标

4. 设置拟合初始值(关键!避免拟合发散)

根据图像的大致情况给初始值,比如640×480的图像:

a = 200    # 参考图像最大灰度值
b = 20     # 参考图像背景灰度值
sigmax = 30# 目测光斑x方向宽度
sigmay = 30# 目测光斑y方向宽度
mux = 320  # 图像宽度的一半
muy = 240  # 图像高度的一半

5. 执行拟合

指定数据列(x=第1列,y=第2列,强度值=第3列):

fit f(x,y) "data.dat" using 1:2:3 via a,b,sigmax,sigmay,mux,muy

拟合完成后,gnuplot会输出各参数的最优值、误差范围,可直接记录使用。

6. 绘制拟合结果对比

用多图对比原始图像和拟合曲面:

set multiplot layout 1,2
# 左图:原始光束图像
plot "testpicture_gray.png" binary filetype=png w image title "原始光束"
# 右图:拟合的3D高斯分布
set title "拟合结果"
set pm3d
set hidden3d
splot f(x,y) title "高斯曲面", "data.dat" using 1:2:3 with points pt 0 title "采样数据"
unset multiplot

额外注意事项

  • 如果图像分辨率太高(比如4K),可抽样减少数据量加快拟合:awk 'NR%10==0' data.dat > data_sampled.dat
  • 若不确定初始值,可在gnuplot中用set mouse开启交互,点击图像查看光斑中心坐标和大致宽度

内容的提问来源于stack exchange,提问作者flammen

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.27 13:32:25