基于MATLAB的光學CCD全息成像仿真程序實現
一、流程
二、代碼
%% 參數設置
lambda = 632.8e-9; % 波長(He-Ne激光)
pixel_size = 5e-6; % CCD像素尺寸(m)
M = 1024; % 圖像分辨率
z = 0.1; % 物距(m)
exposure = 0.1; % 曝光時間(s)
qe = 0.65; % 量子效率
read_noise = 3; % 讀出噪聲(e-)
cte = 0.9999; % 電荷轉移效率%% 物光與參考光生成
[X,Y] = meshgrid(linspace(-0.01,0.01,M), linspace(-0.01,0.01,M));
object = exp(-(X.^2 + Y.^2)/(2*(0.005)^2)); % 高斯物體
reference = exp(1i*2*pi*(X.^2 + Y.^2)/(lambda*z)); % 平面參考光%% 全息圖記錄
interference = object + reference;
hologram = abs(interference).^2; % 干涉強度記錄%% CCD光電轉換
% 量子效率轉換
charge = hologram * qe * exposure;
% 暗電流噪聲(泊松分布)
dark_noise = poissrnd(0.1*exposure, M, M);
electrons = charge + dark_noise;
% 飽和限制
electrons(electrons > 15000) = 15000;%% 電荷轉移模擬
for stage = 1:3 % 3相時鐘轉移% 轉移效率模型loss = cte * (1 - 0.05*stage);electrons = circshift(electrons, [0,1]) * loss + electrons*0.1;
end%% 讀出噪聲注入
voltage = electrons * 0.15 + read_noise*randn(M,M); % 轉換增益0.15μV/e-
digital = im2uint16(voltage);%% 圖像重建
% 傅里葉變換重建
H = fftshift(fft2(hologram));
reconstructed = ifftshift(ifft2(H));
reconstructed = abs(reconstructed);%% 可視化
figure;
subplot(2,2,1); imshow(object,[]); title('原始物體');
subplot(2,2,2); imshow(hologram,[]); title('全息圖');
subplot(2,2,3); imshow(uint8(electrons),[]); title('CCD輸出');
subplot(2,2,4); imshow(reconstructed,[]); title('重建圖像');
三、關鍵模塊詳解
1. 全息圖記錄優化
% 離軸全息改進(消除孿生像)
theta = 0.1; % 參考光傾斜角
ref_phase = exp(1i*theta*X);
hologram = (object + ref_phase).^2;
2. 電荷轉移模型
% 動態轉移效率模擬
cte_vector = linspace(cte, 0.95, size(electrons,2));
for col = 1:size(electrons,2)electrons(:,col) = circshift(electrons(:,col), [0,1]) * cte_vector(col);
end
3. 噪聲建模
% 混合噪聲模型
thermal_noise = 0.05*randn(M,M); % 熱噪聲
read_noise = 3*randn(M,M); % 讀出噪聲
total_noise = sqrt(dark_noise.^2 + thermal_noise.^2 + read_noise.^2);
參考代碼 仿真光學CCD進行全息成像的仿真程序 www.youwenfan.com/contentcng/52581.html
四、擴展功能實現
-
多波長融合
lambda1 = 632.8e-9; % 紅光 lambda2 = 532e-9; % 綠光 hologram = (object1 + object2).^2;
-
實時處理框架
data = readFromCamera(); % 模擬CCD數據采集 process(data); % 實時處理流水線
-
深度學習輔助
net = alexnet; trained_net = trainNetwork(trainingData,net); denoised = classify(trained_net, noisyImage);