-
Notifications
You must be signed in to change notification settings - Fork 2
/
CX17_4.m
32 lines (32 loc) · 1.54 KB
/
CX17_4.m
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
Uo=imread('guang1.jpg'); %读入图像
Uo=double(Uo(:,:,1))./255; %将图像的灰阶二值化为0和1
figure,imshow(Uo,[]) %显示作为物的图像
[r,c]=size(Uo);
ef=0.5; %设置随机相位噪声系数
phai=rands(r,c).*pi.*ef; %生成随机相位
FUo=fftshift(fft2(Uo.*exp(j.*phai))); %做FFT变换
A=abs(FUo); %光场的振幅分布
figure,imshow(A,[])
real1=real(FUo)./max(A(:)).*255; %将实部量化到256灰阶
imag1=imag(FUo)./max(A(:)).*255; %将虚部量化到256灰阶
%下面计算李氏二元全息图
CGH=zeros(r*4,c*4); %预设CGH矩阵
for n=1:r
for m=1:c
cgh=zeros(4,4);
if real(FUo(n,m))>=0&imag(FUo(n,m))>=0 %若实部大于0且虚部也大于0
cgh(1:round(real1(n,m)/64+0.5),1)=1;cgh(1:round(imag1(n,m)/64+0.5),2)=1;
elseif real(FUo(n,m))>=0&imag(FUo(n,m))<0 %若实部大于0而虚部小于0
cgh(1:round(real1(n,m)/64+0.5),1)=1;cgh(1:round(abs(imag1(n,m))/64+0.5),4)=1;
elseif real(FUo(n,m))<0&imag(FUo(n,m))>=0 %若实部小于0而虚部大于0
cgh(1:round(abs(real1(n,m))/64+0.5),3)=1;cgh(1:round(imag1(n,m)/64+0.5),2)=1;
elseif real(FUo(n,m))<0&imag(FUo(n,m))<0 %若实部小于0且虚部也小于0
cgh(1:round(abs(real1(n,m))/64+0.5),3)=1;cgh(1:round(abs(imag1(n,m))/64+0.5),4)=1;
end
CGH((n-1)*4+1:n*4,(m-1)*4+1:m*4)=cgh; %将生成的抽样单元放到计算全息图中
end
end
figure,imshow(CGH,[]) %显示计算全息图
rU=fftshift(ifft2(CGH)); %逆傅里叶变换得到再现光场
rI= rU.*conj(rU); %计算再现像
figure,imshow(rI,[0,max(max(rI))/10000])%显示再现像