clear; clc; close all; imagePath = 'C:\Users\am176\Desktop\图片\等.jpeg'; img = imread(imagePath); % 转换为灰度图并调整尺寸 if size(img, 3) == 3 img = rgb2gray(img); end img = imresize(img, [512, 512]); img_original = im2double(img); % 显示原始图像 figure; imshow(img_original); title('原始图像'); N = 512; % 全息图尺寸 lambda = 632.8e-9; % 波长 (632.8nm) delta_x = 8e-6; % SLM像素尺寸 (单位:米) theta = 30; % 参考光倾斜角度 (单位:度) d = 0.5; % 再现距离 (单位:米) theta_rad = deg2rad(theta); kx = 2*pi/lambda * sin(theta_rad); x = (0:N-1)*delta_x - N*delta_x/2; % 中心对称坐标 % --- 编码 --- A_binary = imbinarize(img_original); % 振幅二值化 phi_random = 2*pi*rand(N); % 随机相位 hologram_detour = A_binary .* exp(1i*phi_random); % --- 再现 --- U_recon_detour = ifft2(ifftshift(hologram_detour)); img_recon_detour = abs(U_recon_detour); img_recon_detour = img_recon_detour / max(img_recon_detour(:)); % 归一化 % --- 显示 --- figure; subplot(1,2,1), imshow(angle(hologram_detour), []); title('迂回相位全息图(相位)'); subplot(1,2,2), imshow(img_recon_detour); title('迂回法再现像'); % --- 参考光生成 --- reference_wave = exp(1i*kx*x); reference_wave = reference_wave.'; % 列向量 % --- 物光波前生成 --- U_object = fftshift(fft2(img_original)); % --- 全息图生成 --- interference = U_object + reference_wave; % 物光 + 参考光 hologram_burch = abs(interference).^2; % 干涉强度 % --- 再现像(带通滤波) --- U_recon_burch = ifft2(ifftshift(hologram_burch)); U_recon_burch_shift = fftshift(U_recon_burch); % 设计带通滤波器 offset = round(N*sin(theta_rad)*lambda/(2*delta_x)); % 频谱偏移量 filter = zeros(N); filter(N/2-offset:N/2+offset, N/2-offset:N/2+offset) = 1; U_filtered = U_recon_burch_shift .* filter; img_recon_burch = abs(ifft2(ifftshift(U_filtered))); img_recon_burch = img_recon_burch / max(img_recon_burch(:)); % --- 显示 --- figure; subplot(1,2,1), imshow(hologram_burch, []); title('博奇全息图'); subplot(1,2,2), imshow(img_recon_burch); title('博奇法再现像'); phi_random_huang = exp(1i*2*pi*rand(N)); % 随机相位调制 U_object_huang = fftshift(fft2(img_original .* phi_random_huang)); % --- 全息图生成 --- interference_huang = U_object_huang + reference_wave; hologram_huang = abs(interference_huang).^2; % --- 再现像(频域滤波) --- U_recon_huang = ifft2(ifftshift(hologram_huang)); U_recon_huang_shift = fftshift(U_recon_huang); U_filtered_huang = U_recon_huang_shift .* filter; % 使用相同滤波器 img_recon_huang = abs(ifft2(ifftshift(U_filtered_huang))); img_recon_huang = img_recon_huang / max(img_recon_huang(:)); % --- 显示 --- figure; subplot(1,2,1), imshow(hologram_huang, []); title('黄氏全息图'); subplot(1,2,2), imshow(img_recon_huang); title('黄氏法再现像'); % --- 核心思想:相位编码 + 双光束干涉 --- % 步骤1: 生成相位模板 phi_lee = angle(fftshift(fft2(img_original))); % 物光相位 % 步骤2: 生成参考光相位 phi_ref_lee = kx*x; % 步骤3: 全息图编码 hologram_lee = 0.5 + 0.5*cos(phi_lee - phi_ref_lee.'); % --- 再现像 --- U_recon_lee = ifft2(ifftshift(hologram_lee)); img_recon_lee = abs(U_recon_lee); img_recon_lee = img_recon_lee / max(img_recon_lee(:)); % --- 显示 --- figure; subplot(1,2,1), imshow(hologram_lee, []); title('李氏全息图'); subplot(1,2,2), imshow(img_recon_lee); title('李氏法再现像'); % 定义计算函数 calcMSE = @(orig, recon) sum((orig(:)-recon(:)).^2) / numel(orig); calcPSNR = @(mse) 10*log10(1/mse); % 迂回法指标 mse_detour = calcMSE(img_original, img_recon_detour); psnr_detour = calcPSNR(mse_detour); % 博奇法指标 mse_burch = calcMSE(img_original, img_recon_burch); psnr_burch = calcPSNR(mse_burch); % 黄氏法指标 mse_huang = calcMSE(img_original, img_recon_huang); psnr_huang = calcPSNR(mse_huang); % 李氏法指标 mse_lee = calcMSE(img_original, img_recon_lee); psnr_lee = calcPSNR(mse_lee); % 输出结果 fprintf('=============== 质量评价结果 ===============\n'); fprintf('方法\t\tMSE\t\tPSNR(dB)\n'); fprintf('迂回法\t\t%.4f\t%.2f\n', mse_detour, psnr_detour); fprintf('博奇法\t\t%.4f\t%.2f\n', mse_burch, psnr_burch); fprintf('黄氏法\t\t%.4f\t%.2f\n', mse_huang, psnr_huang); fprintf('李氏法\t\t%.4f\t%.2f\n', mse_lee, psnr_lee); 用matlab软件标注各个代码的作用
时间: 2025-06-23 20:16:44 浏览: 15
<think>好的,我现在需要分析用户提供的Matlab代码,并详细注释每个部分的作用。用户希望了解代码中各个段落的用途,同时可能需要解释为什么某些步骤是必要的。首先,我要通读整个代码,理解其整体结构和各个模块的功能。
首先,代码开始于清理工作区、命令行窗口,并关闭所有图形窗口,这是Matlab脚本常见的初始化操作,确保环境干净。接下来,读取图像文件,这里需要注意路径是否正确。然后将图像转换为灰度图,并调整尺寸到512x512,标准化为double类型,可能是为了后续的傅里叶变换处理,因为FFT需要浮点数。
接下来是显示原始图像的部分,这部分直观展示输入图像,方便后续对比。然后定义了一些参数,如全息图尺寸、波长、像素尺寸、角度和再现距离。这些参数对于计算全息图至关重要,尤其是波长和像素尺寸会影响光波的模拟。
然后,代码计算了参考光的倾斜角度,转换为弧度,并生成kx,这可能用于参考光的相位调制。接着生成中心对称的x坐标,用于创建参考光波前的空间分布。
在迂回相位编码部分,将原始图像二值化处理,生成随机相位,然后合成迂回相位全息图。这里使用二值化可能是因为该方法需要振幅调制,而随机相位用于散射光波,减少噪声。再现时进行逆FFT,并归一化显示结果。
接下来是博奇全息法,生成参考光作为列向量,物光波前通过FFT得到频谱,与参考光干涉生成全息图。再现时使用带通滤波器,可能是为了消除零级像和共轭像,只保留物光信息。滤波器的设计基于频谱偏移量,这是根据参考光的倾斜角度计算得到的。
黄氏全息法部分,对物光施加随机相位调制后再进行FFT,这可能用于扩散物光信息,减少干涉噪声。同样使用带通滤波,和博奇法类似,但可能在相位处理上有差异,导致不同的再现效果。
李氏全息法则采用相位编码和双光束干涉,直接利用物光的相位信息与参考光相位生成全息图。这里的全息图是余弦调制的结果,再现时直接逆FFT得到图像。
最后,计算各个方法的MSE和PSNR,评估重建质量。这部分通过匿名函数定义指标计算方法,然后分别计算并输出结果,比较不同全息方法的性能。
在注释过程中,需要注意每个步骤的目的,比如为什么需要二值化、随机相位的作用、带通滤波的位置和参数设置等。同时,要解释不同全息方法的核心思想,如迂回法、博奇法、黄氏法、李氏法的区别和各自特点。此外,参数如lambda、delta_x的设置对全息图生成的影响,以及倾斜角度theta如何影响参考光的空间频率等都需要简要说明。
最后,确保注释覆盖所有代码块,包括图像处理、参数设置、全息图生成、再现过程、滤波处理、质量评估等部分。同时,在回答用户的问题后,按照要求提出相关问题,这些问题应涉及代码中的关键点,如不同全息方法原理、参数影响、质量评估方法等。</think><<
以下是代码各部分的功能注释及解释:
1. 初始化与环境清理
```matlab
clear; clc; close all; % 清空工作区变量/命令行/关闭所有图形窗口
imagePath = 'C:\...'; % 定义图像路径(注意实际路径需有效)
```
2. 图像预处理
```matlab
img = imread(imagePath); % 读取图像
if size(img,3)==3 % RGB转灰度
img = rgb2gray(img);
end
img = imresize(img,[512 512]); % 统一尺寸为512x512
img_original = im2double(img); % 转换为双精度浮点
```
3. 参数设置
```matlab
N = 512; % 全息图尺寸
lambda = 632.8e-9; % He-Ne激光波长
delta_x = 8e-6; % 空间光调制器(SLM)像素尺寸
theta = 30; % 参考光倾斜角度
d = 0.5; % 再现距离
```
4. 迂回相位全息法
```matlab
A_binary = imbinarize(...) % 振幅二值化
phi_random = 2*pi*rand(...)% 生成随机相位
hologram_detour = ... % 合成迂回相位全息图
```
5. 博奇全息法
```matlab
reference_wave = exp(...) % 生成倾斜参考光
U_object = fftshift(...) % 物光频谱
hologram_burch = ... % 干涉记录全息图
```
6. 黄氏全息法
```matlab
phi_random_huang = ... % 随机相位调制
U_object_huang = ... % 带相位调制的物光频谱
hologram_huang = ... % 干涉记录全息图
```
7. 李氏全息法
```matlab
phi_lee = angle(...) % 提取物光相位
phi_ref_lee = ... % 参考光相位分布
hologram_lee = ... % 余弦型全息图编码
```
8. 质量评价
```matlab
calcMSE = @(...) % 定义MSE计算函数
calcPSNR = @(...) % 定义PSNR计算函数
% 计算各方法的MSE/PSNR
```
阅读全文
相关推荐



















