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) == 3
    gray_img = rgb2gray(original_img);
else
    gray_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) = \frac{e^{ikz}}{i\lambda z} \iint U_0(x',y') e^{\frac{ik}{2z}[(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/contentcnd/83216.html
此代码模拟了光学系统中的菲涅尔衍射过程,适用于全息、光学加密和衍射光学元件等应用场景。
 
                    
                
 
                
            
         浙公网安备 33010602011771号
浙公网安备 33010602011771号