|
|
A=zeros(64);%产生一个64*64的全零矩阵。
A(10:50,10:15)=1;%此区域为1。
A(10:15,10:50)=1;
A(25:30,10:45)=1;
figure(1),imshow(A);
ppp=exp(rand(64)*pi*2*i);%产生一个与A大小相同的随机相位。
A=A.*ppp;%图像乘随机位相因子的办法来平滑物函数的傅立叶变换谱
C=fft2(fftshift(A));%对图像进行快速傅里叶变换。
C=fftshift(C);%频谱中间移位
Am=abs(C);%计算出物函数傅立叶变换谱的模
Ph=angle(C);%计算出幅角
th=max(max(Am));
Am=Am./th;%对模进行归一化
Ph=Ph./(pi*2);%幅角(相位)归一化
s=15;%设定抽样单元边长?
cgh=zeros(64*s);%定义cgh为一个(64*s)*(64*s)的全零矩阵
for m=1:64;
for n=1:64;
hol=zeros(s);%定义hol为一个s*s全零矩阵
w=(s+1)/2;
f=s-1;
h=round(Am(m,n)*f);%矩形的高度等于归一化的频谱幅值
p=round(Ph(m,n)*f);%偏离单元中心的量
if abs(Ph(m,n))<=1/4;%根据迂回相位编码原理,对于相位小于PI/4,则直接用单元的高度表达频谱的幅值,偏移中心量表达频谱的相位。
I1=round(w+h/2)-round(w-h/2);
m1=round(w+p+0.25*f)-round(w+p-0.25*f);
hol(round(w-h/2):round(w+h/2),round(w+p-0.25*f):round(w+p+0.25*f))=ones(I1+1,m1+1);
elseif Ph(m,n)>1/4;
I2=round(w+h/2)-round(w-h/2);
m2=s-round(w+p-0.25*f);
m3=round(0.5*f+1-m2)-1;
hol(round(w-h/2):round(w+h/2),round(w+p-0.25*f):s)=ones(I2+1,m2+1);
hol(round(w-h/2):round(w+h/2),1:round(0.5*f+1-m2))=ones(I2+1,m3+1);
else
I3=round(w+h/2)-round(w-h/2);
m4=round(w+p+0.25*f)-1;
m5=s-round(s-0.5*f+m4);
hol(round(w-h/2):round(w+h/2),1:round(w+p+0.25*f))=ones(I3+1,m4+1);
hol(round(w-h/2):round(w+h/2),round(s-0.5*f+m4):s)=ones(I3+1,m5+1);
end;
%对开孔矩形的位置偏离中心超过,则在进行位相编码时,当相位 > PI/2时,为了防止与邻近的矩形
%孔发生重叠而造成全息图再现时产生失真,依据光栅衍射理论,在程序中采用了“模式溢出校%正法”,即将溢出部分移至本抽样单元的另一侧。
cgh((m-1)*s+1:m*s,(n-1)*s+1:n*s)=hol;
end;
end;
figure(2),imshow(cgh,[]);
Re=ifft2(ifftshift(cgh));
k=fspecial('log');
Re=imfilter(Re,k);
Re=ifftshift(Re);
B=abs(Re);
figure;imagesc(B,[0 0.03]);
colormap(gray);
axis off;
s=15;%设定抽样单元边长?这句理解得对吗?为什么要定义为15?
if abs(Ph(m,n))<=1/4;%根据迂回相位编码原理,对于相位小于PI/4,则直接用单元的高度表达频谱的幅值,偏移中心量表达频谱的相位。
I1=round(w+h/2)-round(w-h/2);
m1=round(w+p+0.25*f)-round(w+p-0.25*f);
hol(round(w-h/2):round(w+h/2),round(w+p-0.25*f):round(w+p+0.25*f))=ones(I1+1,m1+1);
也麻烦帮我讲解一下好吗?
谢谢~~~ |
|