基于Matlab的数字全息相位展开及再现实现
一、核心流程设计
数字全息相位展开及再现的关键步骤包括:全息图生成、相位展开、衍射重建、后处理优化。
二、关键参数定义
% 基本参数
lambda = 632.8e-6; % 波长(mm)
k = 2*pi/lambda; % 波数
z = 0.3; % 记录距离(mm)
pix_size = 8e-3; % 像素尺寸(mm)
N = 1024; % 全息图分辨率
L = N*pix_size; % 全息图尺寸(mm)
三、全息图生成与相位编码
-
物光场生成
加载目标图像并转换为复振幅分布:
obj = imread('lena.jpg'); obj_gray = rgb2gray(obj); [M,N] = size(obj_gray); obj_amp = im2double(obj_gray)/255; % 振幅分布 obj_phase = 2*pi*rand(M,N); % 随机相位分布 -
全息图记录
通过角谱法计算全息图:
% 物光场与参考光干涉 H = exp(1j*k*z/(2*z)) * exp(-1j*pi*lambda*z/(2*z)*(ones(M,N))); % 参考光 hologram = obj_amp .* exp(1j*obj_phase) + H; % 干涉场 hologram = hologram ./ (abs(hologram) + eps); # 归一化 imwrite(abs(hologram), 'hologram.tif'); # 保存全息图
四、相位展开算法实现
采用最小二乘法相位解包处理包裹相位:
% 提取包裹相位
wrapped_phase = angle(hologram);
% 相位展开(最小二乘法)
[unwrapped_phase, ~] = lsq_unwrap(wrapped_phase, 2*pi);
% 可视化
figure;
subplot(1,2,1); imshow(wrapped_phase, []); title('包裹相位');
subplot(1,2,2); imshow(unwrapped_phase, []); title('展开相位');
关键函数 lsq_unwrap实现:
function [unwrapped, reliability] = lsq_unwrap(wrapped, pixel_size)
% 输入:wrapped - 包裹相位(rad)
% 输出:unwrapped - 展开相位(rad)
[rows, cols] = size(wrapped);
reliability = ones(rows, cols);
% 构建线性方程组 Ax = b
A = zeros(2*rows*cols, 2*rows*cols);
b = zeros(2*rows*cols, 1);
% 填充矩阵(基于相位梯度约束)
k = 0;
for i = 1:rows
for j = 1:cols
idx = (i-1)*cols + j;
if i < rows
A(2*idx-1,:) = [1, -exp(1j*k*pixel_size), 0, 0];
b(2*idx-1) = wrapped(i,j) - wrapped(i+1,j);
end
if j < cols
A(2*idx,:) = [1, 0, -exp(1j*k*pixel_size), 0];
b(2*idx) = wrapped(i,j) - wrapped(i,j+1);
end
end
end
% 最小二乘求解
x = A\b;
unwrapped = reshape(x(1:2:end), rows, cols);
reliability = abs(x(2:2:end));
end
五、衍射重建与再现
-
菲涅尔衍射重建
使用S-FFT算法进行逆衍射计算:
function recon = fresnel_reconstruct(hologram, z, lambda, pix_size) [N, ~] = size(hologram); k = 2*pi/lambda; % 预处理 H = fftshift(fft2(hologram)); % 频域传播因子 fx = (-N/2:N/2-1)*(1/(N*pix_size)); [FX, FY] = meshgrid(fx, fx); Hiz = exp(1j*k*z/(2*z)) .* exp(-1j*pi*lambda*z*(FX.^2 + FY.^2)); # 逆变换 recon = fftshift(ifft2(ifftshift(H .* Hiz))); recon = recon ./ (abs(recon) + eps); end -
零级像消除
采用Contourlet变换去除零级衍射斑:
function clean_recon = remove_zero_order(recon) [c, s] = contourlet(recon, 'max_level', 3); c(1,:) = 0; c(2,:) = 0; % 抑制低频分量 clean_recon = icontourlet(c, s); end
参考代码 实现数字全息相位展开及再现 www.youwenfan.com/contentcnn/84714.html
六、完整重建流程
% 衍射重建
recon = fresnel_reconstruct(hologram, z, lambda, pix_size);
% 零级像消除
clean_recon = remove_zero_order(recon);
% 显示结果
figure;
subplot(1,2,1); imshow(abs(recon), []); title('原始重建像');
subplot(1,2,2); imshow(abs(clean_recon), []); title('去零级像后');
七、应用场景验证
-
三维物体重建
对分层物体(如微结构芯片)进行层析重建:
% 分层物体建模 layers = load('microchip.mat'); % 包含各层相位信息 for layer = 1:size(layers, 3) hologram_layer = generate_hologram(layers(:,:,layer)); recon_layer = fresnel_reconstruct(hologram_layer, z, lambda, pix_size); figure; imshow(recon_layer); title(['Layer ', num2str(layer)]); end -
动态过程监测
结合高速相机实现实时相位变化追踪:
% 模拟振动相位调制 vibration_phase = 0.1*sin(2*pi*50*t); % 50Hz振动 hologram_vib = hologram .* exp(1j*vibration_phase); recon_vib = fresnel_reconstruct(hologram_vib, z, lambda, pix_size);
八、结果评估指标
% 计算重建质量指标
def calculate_metrics(original, recon):
psnr = psnr(recon, original);
ssim_val = ssim(recon, original);
mae = mean(abs(recon(:) - original(:)));
return psnr, ssim_val, mae
original = imread('reference.png');
metrics = calculate_metrics(original, recon_clean);
disp(['PSNR: ', num2str(metrics(1)), ' dB']);
disp(['SSIM: ', num2str(metrics(2))]);
disp(['MAE: ', num2str(metrics(3))]);
九、扩展应用方向
-
多波长融合
结合RGB三波长全息图提升色彩保真度:
% 多波长重建 lambda_red = 650e-6; lambda_green = 532e-6; lambda_blue = 450e-6; recon_red = fresnel_reconstruct(hologram_red, z, lambda_red, pix_size); recon_green = fresnel_reconstruct(hologram_green, z, lambda_green, pix_size); recon_blue = fresnel_reconstruct(hologram_blue, z, lambda_blue, pix_size); recon_rgb = cat(3, recon_red, recon_green, recon_blue); -
深度学习增强
使用U-Net网络优化相位解包过程:
% 加载预训练模型 net = load('phase_unwrap_unet.mat'); unwrapped_phase = predict(net, wrapped_phase);

浙公网安备 33010602011771号