当前位置: 首页 > news >正文

MATLAB实现图像菲涅尔衍射

MATLAB实现图像菲涅尔衍射的代码。该代码读取输入图像,模拟菲涅尔衍射过程,并生成衍射图样。

% 菲涅尔衍射模拟
clear all;
close all;
clc;% ===== 参数设置 =====
lambda = 632.8e-9;   % 波长 (632.8 nm 红光)
z = 0.1;             % 传播距离 (0.1 m)
pixel_size = 10e-6;  % 像素尺寸 (10 μm)% ===== 读取并预处理图像 =====
[filename, pathname] = uigetfile({'*.jpg;*.png;*.bmp;*.tif', 'Image Files'}, '选择输入图像');
if isequal(filename, 0)error('未选择图像');
end
img_path = fullfile(pathname, filename);% 读取图像并转换为灰度
original_img = imread(img_path);
if size(original_img, 3) == 3gray_img = rgb2gray(original_img);
elsegray_img = original_img;
end% 调整图像大小为2的幂次方以提高FFT效率
target_size = 512;  % 推荐使用512x512或1024x1024
gray_img = imresize(gray_img, [target_size, target_size]);
gray_img = im2double(gray_img);  % 转换为双精度浮点数 [0, 1]% ===== 准备计算网格 =====
[M, N] = size(gray_img);
[x, y] = meshgrid(1:N, 1:M);% 中心化坐标
x = (x - ceil(N/2)) * pixel_size;
y = (y - ceil(M/2)) * pixel_size;% ===== 创建输入场 =====
% 假设输入是振幅掩模,相位均匀
input_field = gray_img;  % 振幅
% input_field = gray_img .* exp(1i * 2*pi*rand(M,N));  % 可选的随机相位% ===== 菲涅尔衍射计算 =====
k = 2 * pi / lambda;  % 波数% 方法1: 直接积分法 (精确但较慢)
% diffracted_field = zeros(M, N);
% for i = 1:M
%     for j = 1:N
%         r = sqrt(x.^2 + y.^2 + z^2);
%         kernel = exp(1i * k * r) ./ r;
%         diffracted_field(i, j) = sum(sum(input_field .* kernel));
%     end
% end
% diffracted_field = diffracted_field * (1i / lambda) * z;% 方法2: 卷积法/角谱法 (快速)
% 创建菲涅尔核
r_sq = x.^2 + y.^2;
fresnel_kernel = exp(1i * k / (2 * z) * r_sq);% 通过FFT进行卷积
input_fft = fft2(input_field);
kernel_fft = fft2(fftshift(fresnel_kernel));
diffracted_fft = input_fft .* kernel_fft;
diffracted_field = ifft2(diffracted_fft);% 添加传播相位因子
diffracted_field = diffracted_field .* exp(1i * k * z) / (1i * lambda * z);% ===== 计算衍射强度 =====
diffraction_intensity = abs(diffracted_field).^2;% ===== 可视化结果 =====
figure('Position', [100, 100, 1200, 500], 'Name', '菲涅尔衍射模拟');% 原始图像
subplot(1, 3, 1);
imshow(gray_img);
title('原始图像');
axis off;% 输入频谱
subplot(1, 3, 2);
input_spectrum = log(1 + abs(fftshift(fft2(input_field))));
imagesc(input_spectrum);
colormap('gray');
title('输入频谱');
axis off;
axis equal;% 衍射图样
subplot(1, 3, 3);
% 使用对数尺度增强显示
output_display = log(1 + diffraction_intensity / max(diffraction_intensity(:)));
imagesc(output_display);
colormap('hot');
title('菲涅尔衍射图样');
axis off;
axis equal;% 添加参数信息到图像
annotation('textbox', [0.15, 0.02, 0.7, 0.05], 'String', ...sprintf('波长: %.1f nm | 传播距离: %.1f cm | 像素尺寸: %.1f μm', ...lambda*1e9, z*100, pixel_size*1e6), ...'EdgeColor', 'none', 'HorizontalAlignment', 'center', ...'FontSize', 10, 'FontWeight', 'bold');% ===== 保存结果 =====
output_dir = '衍射结果';
if ~exist(output_dir, 'dir')mkdir(output_dir);
end% 保存衍射图样
imwrite(mat2gray(output_display), fullfile(output_dir, '衍射图样.png'));
% 保存参数
save(fullfile(output_dir, '衍射参数.mat'), 'lambda', 'z', 'pixel_size');disp('处理完成! 结果已保存到 "衍射结果" 文件夹');

说明:

  1. 参数设置

    • 波长(lambda):可见光范围(400-700nm),默认为632.8nm(红光)
    • 传播距离(z):决定衍射效果,典型值0.1-1m
    • 像素尺寸(pixel_size):影响空间分辨率
  2. 图像处理

    • 使用uigetfile交互式选择图像
    • 自动转换为灰度图
    • 调整尺寸至512×512(优化计算效率)
  3. 菲涅尔衍射计算

    • 提供了两种方法:
      • 直接积分法(精确但计算量大,已注释)
      • 卷积法/角谱法(基于FFT,快速高效)
    • 核心公式:U(x,y)=eikziλz∬U0(x′,y′)eik2z[(x−x′)2+(y−y′)2]dx′dy′U(x,y) = \frac{e^{ikz}}{i\lambda z} \iint U_0(x',y') e^{\frac{ik}{2z}[(x-x')^2+(y-y')^2]} dx'dy'U(x,y)=zeikzU0(x,y)e2zik[(xx)2+(yy)2]dxdy
  4. 结果可视化

    • 并排显示原始图像、输入频谱和衍射图样
    • 衍射图样使用对数尺度增强显示
    • 添加参数信息标注
  5. 结果保存

    • 自动创建"衍射结果"文件夹
    • 保存衍射图样为PNG
    • 保存参数为MAT文件

使用指南:

  1. 运行代码,选择输入图像
  2. 程序自动处理并显示结果
  3. 结果保存在"衍射结果"文件夹中

参数调整建议:

  1. 波长调整

    lambda = 532e-9; % 绿光
    % 或
    lambda = 450e-9; % 蓝光
    
  2. 传播距离调整

    z = 0.05; % 近距离,衍射效应明显
    % 或
    z = 0.5;  % 远距离,衍射图案扩散
    
  3. 相位调制(可选):
    取消注释以下行添加随机相位:

    input_field = gray_img .* exp(1i * 2*pi*rand(M,N));
    

参考代码 读取一个图像,然后对这个图像进行菲涅尔衍射,最终得到衍射图 www.youwenfan.com/contentcsl/83216.html

此代码模拟了光学系统中的菲涅尔衍射过程,适用于全息、光学加密和衍射光学元件等应用场景。

http://www.dtcms.com/a/597898.html

相关文章:

  • Linux开源代码汇总
  • stable-diffusion安装EasyPhoto启动报错解决
  • 做网站标题业之峰装饰官网
  • 做网站挂广告赚多少钱wordpress布局主题
  • PCB之电源完整性之电源网络的PDN仿真CST---08
  • AXI-5.3.1 Memory type requirements
  • Redis vs MongoDB:内存字典与文档库对决
  • 长沙手机网站首页设计公司淮南网络宾馆
  • Python应用指南:利用GET请求获取微博小时热搜榜
  • ROS2 Action 通信详解:从自定义消息到 Server/Client 实现(附 MoveIt! 联动示例)
  • 个人建什么网站最赚钱智慧团建网站登录平台pc端
  • 使用新版本cpu编译vLLM cpu端(编译完成,但是SCNet公网转发8000端口后,连不上)
  • 双浩建设网站aspnet网站开发pdf
  • 云南网站制作公司在线生成短链接
  • 上海企业网站制作报价燕郊网站建设
  • 东航数科开源软件治理体系的建设实践”荣获OSCAR开源+安全及风险治理案例
  • 查企业免费的网站郑州同济医院妇科怎么样
  • 基于SAM2的眼动数据跟踪2.1——修正目标消失的记录方式
  • 网站开发包含网站维护吗建设一个网站可以采用那几方案
  • 【C++】--模板进阶
  • 如何选择企业网站建设wordpress 自动跳转
  • 设计深圳网站制作新北方app下载
  • 【Janet】函数
  • 【微服务 - easy视频 | day04】Seata解决分布式事务
  • 网站关键词没有排名怎么用ip做网站
  • Jmeter超详细使用教程
  • 北京网站优化技术学科分类目录
  • 网站源码下载安全吗找一个免费域名的网站
  • 【Git、GitHub、Gitee】GitLab的概念、注册流程、远程仓库操作以及高级功能详解(超详细)
  • 2025三掌柜赠书活动第四十一期 AI Agent 开发实战:MCP+A2A+LangGraph 驱动的智能体全流程开发