基于点源的全息3D显示(一)
13D物体的三维数据获取
1.1 3dsmax三维数据获取
打开3dsmax,新建一个3d模型,如茶壶,在脚本文件中粘贴如下代码,可输出相应模型的3D数据
exFile=openFile"C:\exportData1.txt"mode:"w"
for obj in geometry
do(
format "对象名称(\"%\");对象的顶点总数:%\n" obj.name obj.mesh.numverts to:exFile
for i in 1 to obj.mesh.numverts
do(
vertPos=getVert obj.mesh i
format" % % %\n" vertPos.x vertPos.y vertPos.z to:exFile
)
)
1.2 二维图像点源采样全息显示
一张图像一般由
m
×
n
m×n
m×n个数据构成,只需将二维图像的平面对应相应的坐标系即可,假设一张图片的尺寸为
L
x
×
L
y
Lx×Ly
Lx×Ly,对其离散为相应的坐标系,此时,在相应的坐标系采用的数目需等于
m
×
n
m×n
m×n,以图片的二维采样为例,二维图像上的点以球面波的方式进行传播,进行说明。
A=imread('e:\TP\DH.BMP'); %输入图片
B=double(A(:,:,1)); %取一层的值,如r、g、b之一
[r,c]=size(B); %图像数据大小,相当于m,n
B=B.*exp(j*rand(size(r,c))*2*pi);
lambda=0.000532; %绿光波长,单位mm
k=2*pi/lambda;
L=8; %空降光调制器尺寸,单位mm
d=1200; %衍射距离
本例中设物平面和衍射面尺寸大小一致
x0=linspace(-L/2,L/2,r);
y0=linspace(-L/2,L/2,c);
[x0,y0]=meshgrid(y0,x0);
%这样就生成了物平面的坐标系空,
xx=linspace(-L/2,L/2,r);
yy=linspace(-L/2,L/2,c);
[xx,yy]=meshgrid(yy,xx);
UF=0;
%以下循环利用菲涅尔衍射积分的卷积表达式,去掉前面的系数(exp(j*k*d)/j*lambda*d),
%对采样图像的每一个点源进行菲涅尔衍射计算,并累加得到复振幅。
for i=1:r
for n=1:c
U=B(i,n).*exp(j*k*((xx-x0(i,n)).^2+(yy-y0(i,n)).^2)/2/d);
%球面波表达式,即求取物平面上每一点在衍射面上的复振幅分布,将物平面上每一点在衍射面上进行叠加
%即得到物平面在衍射面上复诊的值
UF=U+UF;
end
end
% figure,imshow(conj(UF).*conj(UF),[])
I=UF.*conj(UF);
alpha=pi/2.00; %参考光与x轴间的夹角
beita=pi/2.01; %参考光与y轴间的夹角
R=exp(j*k*(x0*cos(alpha)+y0*cos(beita))); %参考光
%下面计算参、物光在全息记录面上的干涉,得到全息图
inter=UF./max(max(sqrt(I)))+R; %调节光束比,并使参、物光干涉
II= inter.*conj(inter); %干涉得到全息图
figure,imshow(II,[]),title('全息图')
%= = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =
%下面计算再现
%先用S-FFT算法再现全息像II
II=double(II);
zi=1200; %全息图到观察面的距离,单位:米
Lix=r*lambda*zi/L; %给出像面的尺寸,单位:米
Liy=c*lambda*zi/L;
x=linspace(-Lix/2,Lix/2,r);y=linspace(-Liy/2,Liy/2,c);
[x,y]=meshgrid(y,x);
F0=exp(j*k*zi)/(j*lambda*zi)*exp(j*k/2/zi*(x.^2+y.^2));
F=exp(j*k/2/zi*(x0.^2+y0.^2)); %用T-FFT算法得到的全息图尺寸与物面一致
% 取再现照明光垂直入射C=1
holo=L/r*L/c*fftshift(fft2(II.*F*1)); holo=holo.*F0;
Ii=holo.*conj(holo);
figure,imshow(Ii,[0,max(max(Ii))./1]),title('S-FFT再现像')