最小二乘解包裹matlab代码





代码来源于《信息光学数字实验室matlab版》

I4=imread('cell21.bmp');I4=double(I4(7:518,10:521,1));  %读取第一幅像面全息图
I3=imread('cell22.bmp');I3=double(I3(7:518,10:521,1));  %读取第二幅像面全息图
I2=imread('cell23.bmp');I2=double(I2(7:518,10:521,1));  %读取第三幅像面全息图
I1=imread('cell24.bmp');I1=double(I1(7:518,10:521,1));  %读取第四幅像面全息图
I1=medfilt2(I1,[3,3]);                            %用中值滤波对全息图降噪
I2=medfilt2(I2,[3,3]);                            %用中值滤波对全息图降噪
I3=medfilt2(I3,[3,3]);                            %用中值滤波对全息图降噪
I4=medfilt2(I4,[3,3]);                            %用中值滤波对全息图降噪
C1=I4-I2;                                         %全息图相减
C2=I1-I3;                                         %全息图相减
ph=atan(C1./(C2+eps));                            %计算包裹相位
figure;imshow(ph,[]);title('包裹相位图');         %显示重建相位
a=ph;                                             %将包裹相位ph赋值给a
%下面开始进行最小二乘解包裹运算
[M,N]=size(a);                                    %计算二维包裹相位的大小(行、列数)
dx=zeros(M,N);dy=zeros(M,N);                      %预设包裹相位沿x方向和y方向的梯度
m=1:M-1; 
dx(m,:)=a(m+1,:)-a(m,:);                          %计算包裹相位沿x方向的梯度
dx=dx-pi*round(dx/pi);                            %去除梯度中的跳跃
n=1:N-1;
dy(:,n)=a(:,n+1)-a(:,n);                          %计算包裹相位沿y方向的梯度
dy=dy-pi*round(dy/pi);                            %去除梯度中的跳跃
p=zeros(M,N);p1=zeros(M,N);p2=zeros(M,N); %为计算ρnm作准备
m=2:M;
p1(m,:)=dx(m,:)-dx(m-1,:);                        %计算Δgxnm-Δgx(n-1)m
n=2:N;
p2(:,n)=dy(:,n)-dy(:,n-1);                        %计算Δgynm–Δgyn(m-1)
p=p1+p2;                                          %计算ρnm
p(1,1)=dx(1,1)+dy(1,1);                           %计算ρnm
n=2:N;
p(1,n)=dx(1,n)+dy(1,n)-dy(1,n-1);                 %赋值Neumann边界条件
m=2:M;
p(m,1)=dx(m,1)-dx(m-1,1)+dy(m,1);
pp=dct2(p)+eps;                                   %计算ρnm的DCT
fi=zeros(M,N);
for m=1:M                                         %计算Φnm在DCT域的精确解
   for n=1:N  
      fi(m,n)=pp(m,n)/(2*cos(pi*(m-1)/M)+2*cos(pi*(n-1)/N)-4+eps);
   end
end
fi(1,1)=pp(1,1);                                  %赋值DCT域的Φ11
phs=idct2(fi);                                    %用iDCT计算解包裹相位在空域中的值
figure,surfl(phs),shading interp,colormap(gray)   %显示解包裹相位
%为检验解包裹效果,对解包裹相位作再包裹运算
U=exp(j.*phs);                                    %用解包裹相位构建光场
rewrap_ph=atan(imag(U)./real(U));                 %作再包裹运算
figure,imshow(rewrap_ph,[])                       %显示再包裹结果

最小二乘解包裹matlab代码_第1张图片
最小二乘解包裹matlab代码_第2张图片
最小二乘解包裹matlab代码_第3张图片

你可能感兴趣的:(三维重构,matlab,图像处理,计算机视觉)