尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

MATLAB透镜成像仿真:几何光学与菲涅尔衍射闭环实现

MATLAB透镜成像仿真:几何光学与菲涅尔衍射闭环实现 简介这是一份面向光学初学者、物理实验教学及MATLAB入门者的透镜成像原理可视化学习工具通过GUI交互式仿真帮助理解物距、像距、焦距等核心概念与薄透镜成像规律。资源包含17个文件以13幅BMP格式的成像过程对比图如Image_before_Phase200.bmp、Image_after_abs600.bmp等直观呈现不同参数下的光场相位/振幅演化辅以3个关键M文件fun_my_lens.m、my_lens.m、fun_Fresnel.m实现计算逻辑以及1个FIG界面文件my_lens.fig构成完整可运行GUI系统压缩包仅1.25MB轻量易部署。已有1222人学习下载适合课堂教学演示、课设实践或自学探究。用户可直接运行GUI拖动滑块实时调节透镜焦距与物距同步观察光线追迹效果、成像位置变化及前后场图像差异配套代码结构清晰、注释充分便于二次开发与原理验证。1. 这不是“画个透镜再标几条线”的演示——它是一套可调参、可验证、可复现的几何光学仿真闭环你见过太多“透镜成像 demo”静态图配公式箭头从物点出发经透镜折射后交于像点最后贴一句“符合高斯公式”。但真实教学与工程预研需要的是——当物距从 300mm 拉到 120mm焦距从 200mm 降到 80mm像高怎么非线性跳变像距是否真在焦点外连续收敛相位延迟引入后衍射效应如何撕裂理想高斯像这个透镜成像模拟.zip不是幻灯片而是一个完整闭环GUI 输入 → 几何光路计算 → 相位/振幅双域建模 → Fresnel 衍射传播 → 多层图像输出Image_before_Phase200.bmp到Image_after_abs600.bmp所有中间态都落盘可查。它用 MATLAB 原生 GUIDE 构建不依赖任何第三方工具箱核心逻辑封装在fun_my_lens.m和fun_Fresnel.m中连苏庆帅.bmp这张测试图都带进项目——说明作者做过实测校准。适合高校光学实验课教师快速部署课堂交互环境也适合光电工程师在无 Zemax 许可时做初步系统参数扫掠。如果你正被“为什么理论像距和仿真结果差 5mm”这类问题卡住这个包里my_lens.fig的控件绑定逻辑和output文件夹的逐帧图像就是你的第一手排错依据。2. 从 GUIDE 界面到物理模型MATLAB GUI 光学仿真的四层数据流设计2.1 GUIDE 界面结构解析控件-回调-参数映射关系该 GUI 使用 MATLAB 经典 GUIDE而非较新的 App Designer构建主界面文件为my_lens.fig对应代码文件my_lens.m。打开.fig文件后可见 7 类控件3 个滑块uicontrol, Style, slider分别控制Object Distance (mm)、Focal Length (mm)、Lens Diameter (mm)2 个文本框uicontrol, Style, edit实时显示当前物距/像距数值支持手动输入覆盖滑块值1 个下拉菜单uicontrol, Style, popupmenu切换成像模式Geometric Optics纯几何追迹、Fresnel Diffraction含衍射、Phase Only仅相位调制1 个按钮uicontrol, Style, pushbuttonRun Simulation触发核心计算流程。提示所有滑块的Min/Max/Value属性在 GUIDE 编辑器中硬编码例如物距滑块范围设为[100, 1000]步长10这直接约束了可探索的物理区间——若需研究微距成像物距 100mm必须手动修改my_lens.m中set(hObject, Min, 50)并重置初始值。2.2 回调函数链从用户操作到物理计算的触发路径GUI 的响应逻辑由my_lens.m中的回调函数驱动。关键链路如下滑块移动触发slider1_Callback→ 调用update_display()更新文本框Run Simulation按钮触发pushbutton1_Callback→ 读取当前所有控件值 → 调用fun_my_lens()主计算函数fun_my_lens.m接收参数后根据下拉菜单选择调用不同子模块if strcmp(mode, Geometric Optics) [image_out, obj_pos, img_pos] geometric_ray_trace(obj_dist, f_len, lens_diam); elseif strcmp(mode, Fresnel Diffraction) [image_out, phase_map] fun_Fresnel(obj_dist, f_len, lens_diam, wavelength, 532e-9); end2.2.1 几何光学模块严格遵循符号规则的高斯公式实现geometric_ray_trace()并非简单套用1/f 1/u 1/v而是实现带符号约定的完整追迹物距u以透镜光心为原点实物为负值MATLAB 坐标系惯例像距v计算后自动判断实像v 0像在透镜右侧或虚像v 0像在左侧同时计算横向放大率m -v/u并据此缩放苏庆帅.bmp的像素尺寸生成Image_on_Phase.bmp即理想像平面图。function [img_out, obj_pos, img_pos] geometric_ray_trace(u, f, diam) % u: object distance (negative for real object) % f: focal length (positive for converging lens) v 1/(1/f - 1/u); % Gaussian formula with sign convention m -v/u; % magnification % Load and resize source image src_img imread(苏庆帅.bmp); [h, w, ~] size(src_img); new_h round(h * abs(m)); new_w round(w * abs(m)); img_out imresize(src_img, [new_h, new_w]); obj_pos [0, -abs(u)]; % object at (0, -|u|) img_pos [0, v]; % image at (0, v) end注意此处imresize使用双线性插值若需保留锐利边缘如测试图中的文字应在调用前添加Method,nearest参数否则小字体可能模糊。2.3 Fresnel 衍射模块从相位屏到强度图的物理引擎当选择Fresnel Diffraction模式时fun_Fresnel.m成为计算核心。它不模拟单条光线而是将透镜建模为相位调制器输入平面苏庆帅.bmp作为物平面振幅分布透镜作用在空间频域施加二次相位因子exp(j*k*(x^2y^2)/(2*f))传播采用角谱法Angular Spectrum Method或直接 Fresnel 积分本项目使用后者更直观function [intensity, phase_map] fun_Fresnel(u, f, diam, varargin) % Parse wavelength wl 532e-9; % default green laser p inputParser; addParameter(p,wavelength,wl); parse(p,varargin{:}); % Define sampling grid N 512; dx 10e-6; % 10um pixel pitch [X,Y] meshgrid((-N/2:N/2-1)*dx, (-N/2:N/2-1)*dx); % Object plane: amplitude from bitmap, phase0 obj_amp double(imread(苏庆帅.bmp))/255; % Lens phase mask: quadratic phase delay lens_phase exp(1j*2*pi/wl * (X.^2Y.^2)/(2*f)); % Propagate to image plane (Fresnel integral) z abs(u) f; % object-to-lens lens-to-image distance H exp(1j*pi/(wl*z)*(X.^2Y.^2)) / (1j*wl*z); field_out ifft2(fft2(obj_amp.*lens_phase) .* fft2(H)); intensity abs(field_out).^2; phase_map angle(field_out); end2.3.1 输出图像命名逻辑理解Image_after_Phase200.bmp的物理含义output/目录下 14 张 BMP 文件并非随意生成其命名严格对应计算流程节点文件名物理含义生成时机Image_before_Phase200.bmp物平面振幅图200mm 物距fun_Fresnel输入前Image_after_Phase200.bmp经透镜相位调制后的场分布obj_amp.*lens_phase后Image_after_abs200.bmp200mm 物距下的最终强度像abs(field_out).^2输出Image_on_abs.bmp几何光学模式下的理想像geometric_ray_trace输出提示Phase200/Phase400中的数字指物距单位 mm而非相位值。若需分析其他物距只需修改滑块值并点击Run Simulation新图像会自动覆盖同名文件——因此务必在运行前备份output/目录。3. 实战调试三类典型异常的定位与修复方法3.1 “图像全黑”问题振幅归一化与数值溢出排查现象选择Fresnel Diffraction后Image_after_abs200.bmp显示纯黑但Image_before_Phase200.bmp正常。原因fun_Fresnel.m中intensity abs(field_out).^2计算后未归一化原始强度值可能远小于 1如1e-12保存为 uint8 BMP 时被截断为 0。修复步骤在fun_Fresnel.m末尾添加归一化intensity abs(field_out).^2; intensity uint8(255 * (intensity - min(intensity(:))) / (max(intensity(:)) - min(intensity(:)) eps));验证在命令行运行fun_Fresnel(200,200,10)检查intensity矩阵最大值是否接近 255。若仍偏暗检查dx采样间隔是否过大——dx10e-6对应 10μm 像素若物图细节小于此尺度需减小dx并增大N如N1024但计算量呈平方增长。3.2 “像位置偏移”问题坐标系原点与透镜中心对齐校验现象几何光学模式下Image_on_Phase.bmp中像的位置与理论v200mm不符偏差达 ±15mm。原因苏庆帅.bmp的像素坐标原点左上角未映射到物理坐标系原点透镜光心。imresize改变尺寸后图像中心未对齐光轴。修复步骤修改geometric_ray_trace()中图像放置逻辑% After resizing, center the image on optical axis pad_h ceil((N - new_h)/2); pad_w ceil((N - new_w)/2); img_padded zeros(N,N,3); img_padded(pad_h:pad_hnew_h-1, pad_w:pad_wnew_w-1, :) img_out; img_out img_padded;在my_lens.m的pushbutton1_Callback中确保N输出图像尺寸与fun_my_lens内部一致默认 512。验证用plot(obj_pos(1),obj_pos(2),ro); hold on; plot(img_pos(1),img_pos(2),bx)可视化物/像坐标确认二者纵坐标差等于v。3.3 “GUI 响应迟滞”问题计算耗时与界面冻结优化现象拖动滑块时界面卡死 2~3 秒Run Simulation按钮无反馈。原因fun_Fresnel默认使用N512的二维 FFT每次调用耗时约 1.2si5-8250U 测试而 GUIDE 默认在主线程执行回调阻塞 UI 更新。优化方案二选一轻量级加速推荐在pushbutton1_Callback开头添加waitbar防止误操作hwb waitbar(0, Calculating...,Name,Lens Simulation); % ... call fun_my_lens ... delete(hwb);异步计算高级改用parfeval将fun_Fresnel提交至后台池future parfeval(fun_Fresnel, 1, u, f, diam, wavelength, wl); waitbar(0.5, hwb, Propagating...); intensity fetchOutputs(future);注意异步方案需确保 MATLAB Parallel Computing Toolbox 已安装且fun_Fresnel不依赖 GUI 句柄本项目满足。4. 进阶应用用输出图像反推系统参数与验证衍射极限4.1 从Image_after_abs200.bmp提取实际分辨率——瑞利判据实证理论瑞利判据给出最小可分辨间距δx 0.61 * λ * f / D其中D为透镜直径。本项目lens_diam默认 10mmf200mmλ532nm理论δx ≈ 6.5μm。验证步骤用imshow打开Image_after_abs200.bmp观察苏庆帅.bmp中最细笔画如“帅”字撇捺交点是否分离导入图像至 Image Processing Toolbox用regionprops提取连通区域bw imbinarize(imread(Image_after_abs200.bmp), adaptive); stats regionprops(bw, Area,Centroid,BoundingBox); % 计算相邻小区域中心距 dists pdist([stats.Centroid]); min_dist min(dists(dists0));将min_dist像素乘以dx10e-6得物理距离对比理论δx。若实测值 δx说明系统受像差或离焦主导若接近则衍射极限生效。4.2 相位图分析识别球差与彗差的指纹特征Image_after_Phase200.bmp存储的是复数场的相位angle(field_out)其等高线形态揭示像差类型理想透镜相位等高线为同心圆二次相位项球差边缘相位超前等高线在径向呈“S”形弯曲彗差相位沿某方向不对称等高线呈泪滴状。操作指令phase_img imread(Image_after_Phase200.bmp); % 注意此文件存储的是 phase map % 若为灰度图需还原为 [-pi, pi] 范围 phase_unwrapped (double(phase_img)/255)*2*pi - pi; figure; imagesc(phase_unwrapped); colorbar; title(Unwrapped Phase Map - Look for S-shaped distortion at edges);4.2.1 快速球差量化径向相位残差计算提取相位图中心 100×100 区域拟合二次曲面a*r^2计算残差 RMS[r,~] meshgrid((-50:49)*dx, (-50:49)*dx); r2 r.^2; p_fit polyfit(r2(:), phase_unwrapped(257:356,257:356)(:), 1); residual phase_unwrapped(257:356,257:356) - p_fit(1)*r2; rms_aberration rms(residual(:)); fprintf(RMS spherical aberration: %.3f rad\n, rms_aberration);提示rms_aberration 0.2 rad表明球差显著此时应减小lens_diam或增加f以抑制边缘光线贡献。4.3 多物距扫掠自动化批量生成output/图像集手动拖动滑块效率低下。以下脚本自动生成物距u150:50:600的全套图像u_list 150:50:600; f_val 200; diam_val 10; for i 1:length(u_list) u u_list(i); % Simulate and save [inten, ~] fun_Fresnel(u, f_val, diam_val, wavelength, 532e-9); imwrite(uint8(255*mat2gray(inten)), sprintf(output/Image_after_abs%d.bmp,u)); fprintf(Saved Image_after_abs%d.bmp\n, u); end运行后用montage命令拼接对比图files dir(output/Image_after_abs*.bmp); montage({files.name}, Size,[3,5], BackgroundColor,w);观察像尺寸收缩趋势与背景噪声变化即可直观掌握景深特性——这正是光学系统设计的核心洞察。本文还有配套的精品资源点击获取
返回列表