GS算法(Gerchberg-Saxton algorithm)是一種迭代方法旋讹,當(dāng)輸入和輸出端的各自光強分布已知時,可以通過光學(xué)傳播函數(shù)离斩,例如
傅里葉變化节吮,來恢復(fù)光束的相位分布抽高。
一束激光可以分為兩部分厨内,一部分是相位祈秕,另一部分是光斑光強分布,他們是相互關(guān)聯(lián)的雏胃,可以通過改變光束的相位部分请毛,對光斑進行
整形。上述GS算法就是其中的一種方法瞭亮。
主要分為四步
1.假設(shè)入射光斑是均勻光強方仿,相位因為是未知的,可以用一個隨機相位替代统翩,或者通過Target Intensity的IFFT變化求得
2.然后經(jīng)過FFT變化后仙蚜,得到的是焦距是的光斑分布,光強與Target Intensity比較近似厂汗,但是不夠理想
3.替換上述步驟的光強分布委粉,保留相位分布,得到新的一束激光
4.經(jīng)過IFFT變化后保留光斑的相位娶桦,作為下一次迭代的初始相位
通過上述步驟的反復(fù)迭代贾节,會不斷改善Approximation to target intensity的光斑。
Matlab代碼參考:
%% 數(shù)據(jù)初始化
pic = 'test.jpg'; % 輸入圖片
file = 'phase.bmp'; % 圖片保存位置
num = 1000; % GS迭代次數(shù)
%% 讀取圖片
im = imread(pic);
im = rgb2gray(im);
im = im2double(im);
%% GS算法
im = mat2gray(im);
light = gpuArray(im); % 加入CUDA衷畦,提高計算速度
light = ifft2(light); % 計算初始相位
for n = 1:num
phase = angle(light);
light = 1.*exp(1i*phase); % 1. 均勻光強入射光
light = fft2(light); % 2. 聚焦面上的光強
phase = angle(light);
light = im.*exp(1i*phase); % 3. 理想光斑替換
light = ifft2(light); % 4. 傅里葉逆運算
end
% 均勻光入射后再做一次傅里葉變化
phase = angle(light);
light = 1.*exp(1i*phase);
light = fft2(light);
intensity = mat2gray(abs(light));
imshow(intensity);
%% 保存相位圖
phase = gather(phase); % 將phase返回到內(nèi)存中
imwrite(mat2gray(phase), file)
備注:
1. CUDA可以提高運算的速度栗涂,例如上述過程,當(dāng)上述1000此循環(huán)祈争,沒有CUDA的時候斤程,循環(huán)過程保持在8秒以上,當(dāng)啟用CUDA后菩混,一般在1.1秒左右忿墅。
2. 隨著迭代次數(shù)的增加,恢復(fù)后的光強越來越清晰
3.通過對比原始圖和經(jīng)過迭代后的圖片墨吓,可以判斷觀察后圖片的恢復(fù)程度
您可以通過我們的官方網(wǎng)站了解更多的產(chǎn)品信息球匕,或直接來電咨詢4006-888-532纹磺。
展示全部
展示全部