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('处理完成! 结果已保存到 "衍射结果" 文件夹');
说明:
-
参数设置:
- 波长(
lambda):可见光范围(400-700nm),默认为632.8nm(红光) - 传播距离(
z):决定衍射效果,典型值0.1-1m - 像素尺寸(
pixel_size):影响空间分辨率
- 波长(
-
图像处理:
- 使用
uigetfile交互式选择图像 - 自动转换为灰度图
- 调整尺寸至512×512(优化计算效率)
- 使用
-
菲涅尔衍射计算:
- 提供了两种方法:
- 直接积分法(精确但计算量大,已注释)
- 卷积法/角谱法(基于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)=iλzeikz∬U0(x′,y′)e2zik[(x−x′)2+(y−y′)2]dx′dy′
- 提供了两种方法:
-
结果可视化:
- 并排显示原始图像、输入频谱和衍射图样
- 衍射图样使用对数尺度增强显示
- 添加参数信息标注
-
结果保存:
- 自动创建"衍射结果"文件夹
- 保存衍射图样为PNG
- 保存参数为MAT文件
使用指南:
- 运行代码,选择输入图像
- 程序自动处理并显示结果
- 结果保存在"衍射结果"文件夹中
参数调整建议:
-
波长调整:
lambda = 532e-9; % 绿光 % 或 lambda = 450e-9; % 蓝光 -
传播距离调整:
z = 0.05; % 近距离,衍射效应明显 % 或 z = 0.5; % 远距离,衍射图案扩散 -
相位调制(可选):
取消注释以下行添加随机相位:input_field = gray_img .* exp(1i * 2*pi*rand(M,N));
参考代码 读取一个图像,然后对这个图像进行菲涅尔衍射,最终得到衍射图 www.youwenfan.com/contentcsl/83216.html
此代码模拟了光学系统中的菲涅尔衍射过程,适用于全息、光学加密和衍射光学元件等应用场景。
