Matlab 2023b 光学仿真:5步代码实现 Zernike 像差到 PSF 的完整转换

Matlab 2023b 光学仿真:5步代码实现 Zernike 像差到 PSF 的完整转换
Matlab 2023b 光学仿真5步代码实现 Zernike 像差到 PSF 的完整转换光学系统的成像质量评估中点扩散函数PSF是描述系统对点光源响应特性的核心指标。当光线通过存在像差的光学系统时理想点像会扩散成特定形态的光斑这正是PSF的物理体现。传统PSF计算往往依赖专业光学软件而本文将展示如何通过Matlab 2023b实现从Zernike像差到PSF的完整建模流程仅需5个关键步骤即可获得与商业软件精度相当的仿真结果。1. 光学仿真基础环境搭建在开始Zernike像差建模前需要明确定义光学系统的物理参数和计算空间。这些参数将直接影响后续傅里叶变换的采样精度和PSF的计算范围。%% 光学系统参数初始化 lambda 0.6328e-6; % 工作波长(632.8nm红光) N 512; % 采样点数(推荐2的整数幂) aperture_diameter 0.0254; % 孔径直径(1英寸) focal_length 0.5; % 系统焦距(0.5米) psf_sampling 0.5e-6; % 像面采样间隔(0.5μm)关键参数选择技巧波长选择应优先考虑实际应用场景可见光波段通常为400-700nm采样点数N建议取512或1024以保证计算效率与精度的平衡像面采样间隔需满足Nyquist采样定理一般取λ/2~λ/4为验证参数设置的合理性可添加以下校验代码% 计算截止频率验证采样是否充分 cutoff_freq aperture_diameter/(lambda*focal_length); assert(1/(psf_sampling*N) 2*cutoff_freq,... 采样不足请增大N或减小psf_sampling);2. Zernike多项式生成与像差加载Zernike多项式是描述光学像差的标准化工具其极坐标形式能准确表征波前畸变。Matlab中可通过自定义函数实现Zernike模式生成function [Z] generate_zernike(n, m, r, theta) % 生成Zernike多项式 % n - 径向阶数 % m - 角向频率 % r - 归一化极径(0~1) % theta - 极角(弧度) R zeros(size(r)); for s 0:(n-abs(m))/2 num (-1)^s * factorial(n-s); denom factorial(s) * factorial((nabs(m))/2-s)... * factorial((n-abs(m))/2-s); R R num/denom * r.^(n-2*s); end if m 0 Z R .* cos(m*theta); else Z R .* sin(abs(m)*theta); end Z(r1) 0; % 瞳孔外置零 end实际应用中像差往往是多个Zernike模式的线性组合。以下示例展示如何合成包含初级像差的波前%% 定义Zernike系数(单位:波长) coeffs [0.1 -0.25 0.15 0.08 -0.12]; % 分别对应Z1-Z5 orders [0 1; 1 1; 1 -1; 2 0; 2 2]; % (n,m)对应表 %% 生成归一化极坐标网格 [x_pupil, y_pupil] meshgrid(linspace(-1,1,N)); r sqrt(x_pupil.^2 y_pupil.^2); theta atan2(y_pupil, x_pupil); %% 合成波前像差 W zeros(N); for k 1:length(coeffs) n orders(k,1); m orders(k,2); W W coeffs(k)*generate_zernike(n, m, r, theta); end可视化验证figure imagesc(W); axis image; colorbar title(合成波前像差(波长)); xlabel(X方向采样点); ylabel(Y方向采样点);3. 瞳孔函数构建与傅里叶变换准备获得波前像差后需要构建包含相位信息的瞳孔函数这是计算PSF的关键步骤%% 构建瞳孔函数 pupil_mask double(r 1); % 圆形孔径 E pupil_mask .* exp(1i*2*pi*W); % 复振幅 %% 频域参数计算 delta_fx 1/(psf_sampling*N); % 频域采样间隔 fx (-N/2:N/2-1)*delta_fx; % 频率坐标 [Fx, Fy] meshgrid(fx); % 频率网格物理量纲转换% 将频率转换为空间坐标(像面位置) x_psf fx * lambda * focal_length; y_psf fx * lambda * focal_length;为确保计算精度建议添加以下验证代码% 检查能量守恒 input_energy sum(abs(E(:)).^2); assert(abs(input_energy - pi/4*N^2) 1e-6,... 瞳孔函数能量异常);4. PSF计算与可视化通过二维傅里叶变换即可得到PSF分布这是光学系统成像特性的直接体现%% 计算PSF psf abs(fftshift(fft2(ifftshift(E)))).^2; psf psf / max(psf(:)); % 归一化 %% 可视化结果 figure imagesc(x_psf*1e6, y_psf*1e6, psf); axis image; colorbar; colormap(hot); xlabel(X位置(μm)); ylabel(Y位置(μm)); title(计算得到的PSF分布);参数影响分析 通过修改以下参数可观察PSF变化lambda波长增大导致PSF展宽aperture_diameter孔径增大使PSF变窄coeffs像差系数改变PSF形态为量化PSF质量可计算斯特列尔比(Strehl Ratio)strehl_ratio max(psf(:)) / (pi*aperture_diameter^2/(4*lambda*focal_length))^2; disp([斯特列尔比: num2str(strehl_ratio)]);5. 完整流程封装与参数优化将上述步骤封装为可调用的函数便于参数扫描和批量分析function [psf, W] zernike_to_psf(coeffs, orders, params) % 参数解包 lambda params.lambda; N params.N; aperture params.aperture; focal_length params.focal_length; psf_sampling params.psf_sampling; % 生成坐标网格 [x,y] meshgrid(linspace(-1,1,N)); r sqrt(x.^2 y.^2); theta atan2(y,x); % 合成波前 W zeros(N); for k 1:length(coeffs) W W coeffs(k)*generate_zernike(orders(k,1),orders(k,2),r,theta); end % 计算PSF E double(r1) .* exp(1i*2*pi*W); psf abs(fftshift(fft2(ifftshift(E)))).^2; psf psf / max(psf(:)); end典型应用案例- 像差灵敏度分析% 测试不同Zernike系数对PSF的影响 test_coeffs linspace(0, 0.5, 5); % 系数扫描范围 results cell(length(test_coeffs),1); for k 1:length(test_coeffs) params struct(lambda,632.8e-9, N,512, ... aperture,0.0254, focal_length,0.5, ... psf_sampling,0.5e-6); [psf, W] zernike_to_psf(test_coeffs(k), [2 2], params); results{k} struct(coeff,test_coeffs(k), psf,psf, wavefront,W); end % 结果显示 figure for k 1:length(results) subplot(2,3,k) imagesc(results{k}.psf); axis image off title([Z3系数: num2str(results{k}.coeff)]) end colormap(hot)高级应用PSF在图像复原中的应用获得的PSF可用于图像去卷积处理提升光学系统成像质量。以下展示简单的Richardson-Lucy反卷积算法function restored_img rl_deconv(image, psf, iterations) % 初始化 est_img image; psf_hat rot90(psf,2); % PSF翻转 for n 1:iterations % 计算相对误差 reblurred imfilter(est_img, psf, conv, circular); ratio image ./ (reblurred eps); % 更新估计 est_img est_img .* imfilter(ratio, psf_hat, conv, circular); end restored_img est_img; end使用示例% 模拟模糊图像 original_img im2double(imread(cameraman.tif)); blurred_img imfilter(original_img, psf, conv, circular); % 图像复原 restored_img rl_deconv(blurred_img, psf, 20); % 结果显示 figure subplot(131); imshow(original_img); title(原始图像) subplot(132); imshow(blurred_img); title(模糊图像) subplot(133); imshow(restored_img); title(复原图像)通过这5个步骤的完整实现我们不仅掌握了Zernike像差到PSF的转换原理更构建了可应用于实际光学系统分析与图像处理的计算框架。这种基于Matlab的解决方案相比商业软件具有更好的灵活性和可扩展性特别适合需要快速迭代的光学设计场景。