图像处理——相位恢复(GS,TIE,改进型角谱迭代法)(已更新代码)

利用GS,TIE,改进型角谱迭代算法进行相位恢复

  • *角谱传播理论

角谱传播理论可以翻阅傅里叶光学的书,就能找到定量分析的计算公式,可以分析某个平面的角谱垂直传播到另外一个平面的角谱,得到其振幅与相位信息。下面把一张图的当作一个平面的相位信息,振幅置为恒1,(即相位物体),取d=10,20,30这三个距离根据角谱传播理论计算衍射图,如下:第一张为原图(d=0),2,3,4分别为传播距离d=10,20,30mm处的衍射图。

图像处理——相位恢复(GS,TIE,改进型角谱迭代法)(已更新代码)

图像处理——相位恢复(GS,TIE,改进型角谱迭代法)(已更新代码)

图像处理——相位恢复(GS,TIE,改进型角谱迭代法)(已更新代码)

图像处理——相位恢复(GS,TIE,改进型角谱迭代法)(已更新代码)

以上所得图片2-4均只包含了强度信息,没有相位信息,要用以上图片推回图1(相位物体),有两种基本方法:GS和TIE。融合进角谱传播理论,可以得到四种算法,分别是:

1.改进型角谱迭代算法;

2.TIE强度传输方程直接重建;

3.TIE方程所得相位作为角谱迭代算法初始值进行迭代恢复;

4.GS算法所得相位作为角谱迭代算法初始值进行迭代恢复;

使用matlab根据算法思想写代码,得到其恢复的相位效果如下所示:

图像处理——相位恢复(GS,TIE,改进型角谱迭代法)(已更新代码)

图像处理——相位恢复(GS,TIE,改进型角谱迭代法)(已更新代码)

图像处理——相位恢复(GS,TIE,改进型角谱迭代法)(已更新代码)

图像处理——相位恢复(GS,TIE,改进型角谱迭代法)(已更新代码)
  • *收获

一开始只想着从网上找到现成的代码来实现自己的目的,后来发现这并不是很可靠。虽然可以找到一些,但是不全,而且大部分不适用。最好的办法是自己先了解了理论知识,知道大概有哪几种方法,然后看相关的论文别人是怎么做的。一般情况下别人都会在论文中写出自己实现的算法思想,但不会给出代码。想要实现,就得根据他的算法自己写代码。在有了理论支撑的基础上,我们可以直接找到能够实现我们目标的计算式或算法流程图,对照每一个量设定变量,一个个写出来,然后进行相关运算,就可以了。

注意:1.第一次写出来总会存在问题,要会步进调式,看看每一步得到的数据有没有异常,异常就得排除和修改。

2.注意处理数据时在必要的时候必须归一化,不然总会出错或者效果不理想。

上面用的图是2021.12.26考研那天在酒店午休时拍的照片,当时考完数学有点丧气,天气很冷,房间已经退了,坐在前台客厅,前台服务员问了我冷不冷,要不要开暖气,瞬间暖到我了。幸而结果是好的,留念。

以上方法参考文献:

1.一种基于角谱理论的改进型相位恢复迭代算法_刘宏展

2.强度传输方程和角谱迭代融合的相位检索算法_程鸿

2022.7.4

本来不打算更新代码,因为是我做毕业设计的部分内容,但由于有网友有需求,且现在毕业了,特地在此更新一下代码。如果对你有帮助的话,还请点赞+收藏哟。

1.改进型角谱迭代算法
%% 自己写的根据角谱迭代法进行相位恢复
clc,clear
close all
%% 参数初始化
lambda=632.8e-6;%波长
d=20;%衍射距离mm
N=256;%像素
PIESIZE=8e-3;%像素大小
L=N*PIESIZE;%长宽
k=2*pi/lambda;%波矢
step=500;%迭代次数
loss=ones(step,1);%MSE
psn=zeros(step,1);%psnr
b=1.1;%修正量
a=0.8;
gk=zeros(N,N);
minloss=1;
%% 读入
A0=im2double(imread('3d=20.tif'));
A=ones(N,N);
phasek=2*pi.*rand(N,N);%给出随机的初始相位
phasek1=phasek;
Ei=A.*exp(1j.*phasek);%初始的角谱面
%figure;
%imshow(angle(Ei));
figure;
%% 频域初始化
[x,y,~]=size(Ei);
fX=[0:fix(x/2),ceil(x/2)-1:-1:1]./L;
fY=[0:fix(y/2),ceil(y/2)-1:-1:1]./L;
[fx,fy]=meshgrid(fX,fY);

%% 角谱传播函数
f=fx.^2+fy.^2;
H=exp(1j*k*d.*sqrt(1-(lambda*lambda).*(f)));
HB=1./H;

tic
%% 开始迭代
for n=1:step
    EOO=ifft2((fft2(Ei)).*H);
    AOO=abs(EOO).^2;
    AOO=AOO./max(max(AOO));
    EO=A0.*exp(1j.*angle(EOO));%angle(EOO)是新计算得到的新相位 (像面)
    Eii=ifft2((fft2(EO)).*HB);
    faik=angle(Eii);  %计算得到的新相位 (物面)
    faik=faik./max(max(faik));
    beitak=(phasek-phasek1);
    %abk=(A0-AOO)./pi./2;
    if n>1
       gk1=gk;
       gk=faik-phasek;
       rk=sum((gk.*gk1),"all")/(sum((gk1.^2),"all"));%abs
       phasek1=phasek;
       phasek=faik+beitak*rk;
       phasek=phasek./max(max(phasek));
    else
        gk=faik-phasek;
        phasek=faik;
    end

    Ei=exp(1j*phasek);
    loss(n)=immse(A0,AOO);
    psn(n)= 10 * log10(1/loss(n));
   imshow(faik);
    if loss(n)<minloss %imwrite(faik,fullfile([num2str(loss(n)) '.tif'])) end minloss="min(loss);" toc figure; imshow(a0); title('原图'); imshow(aoo); title('恢复');%%根据恢复的相位通过角谱传播理论计算得到的像面 faik="im2uint8(faik);" figure,imshow(faik);%%恢复的相位 % imshow(abs(eo)); imshow(angle(ei)); %imwrite(faik,'3d="20jp.tif');" %% 保存数据 save('mse.txt','loss','-ascii'); save('psnr.txt','psn','-ascii');< code></minloss>
2.TIE&#x5F3A;&#x5EA6;&#x4F20;&#x8F93;&#x65B9;&#x7A0B;&#x76F4;&#x63A5;&#x6C42;&#x89E3;
clear all;
clc;
close all;

%% TIE&#x5F3A;&#x5EA6;&#x4F20;&#x8F93;&#x65B9;&#x7A0B;&#x8FDB;&#x884C;&#x76F8;&#x4F4D;&#x6062;&#x590D;
piesize=8e-3;%&#x50CF;&#x7D20;&#x5927;&#x5C0F;
L= 564*piesize;   %&#x76F8;&#x4F4D;&#x7269;&#x4F53;&#x7684;&#x957F;
W= 564*piesize;   %&#x76F8;&#x4F4D;&#x7269;&#x4F53;&#x7684;&#x5BBD; 512
lambda=632.8e-6 ;%&#x5149;&#x6E90;&#x6CE2;&#x957F;
k=2*pi/lambda;
d=20;%&#x884D;&#x5C04;&#x8DDD;&#x79BB;

I1=im2double(imread('1d=10.tif'));
I2=im2double(imread('1d=20.tif'));
I3=im2double(imread('1d=30.tif'));
diaotaz=10;%&#x884D;&#x5C04;&#x56FE;&#x4E4B;&#x95F4;&#x7684;&#x8DDD;&#x79BB;
D=(I3-I1)./(2*diaotaz);

[x, y, ~] = size(I2);              %size&#x8FD4;&#x56DE;&#x884C;&#x6570;&#x548C;&#x5217;&#x6570;&#x3002;r_dim&#x4E3A;&#x884C;&#x6570;&#xFF0C;c_dim&#x4E3A;&#x5217;&#x6570;&#xFF0C;~&#x5360;&#x4F4D;&#xFF0C;&#x8868;&#x793A;&#x53EA;&#x8981;&#x884C;&#x548C;&#x5217;&#x7684;&#x503C;
fX = [0:fix(x/2),ceil(x/2)-1:-1:1]/L;%fix&#x5411;&#x4E0B;&#x53D6;&#x6574;&#xFF0C;ceil&#x5411;&#x4E0A;&#x53D6;&#x6574;  %linspace(-x/2,x/2-1,x)/L;
fY = [0:fix(y/2),ceil(y/2)-1:-1:1]/L;%linspace(-y/2,y/2-1,y)/L;%
[fy,fx] = meshgrid(fY,fX);

q=fx.^2+fy.^2;
pesai=ifft2(q).*fft2(k.*D);

H=exp(1j*k*d.*sqrt(1-(lambda*lambda).*(q)));
HB=1./H;

a=ifft2(gradient((gradient(pesai))./I2));
a=a/max(max(a));

m=ifft2(q);
phase=-m.*a;
phase=phase/max(max(phase));

EO=I2.*exp(1j.*phase);
Ei=ifft2((fft2(EO)).*HB);
faik=angle(Ei);
faik=abs(faik);
faik(find(faik==0))=0.01;%&#x53BB;&#x9664;&#x77E9;&#x9635;&#x4E2D;&#x7B49;&#x4E8E;0&#x7684;&#x70B9;

faik=faik/max(max(faik));
% faik=sqrt(faik);
faik=mat2gray(faik);%%&#x5229;&#x7528;TIE&#x5F3A;&#x5EA6;&#x4F20;&#x8F93;&#x65B9;&#x7A0B;&#x8BA1;&#x7B97;&#x5F97;&#x5230;&#x7684;&#x76F8;&#x4F4D;&#x4FE1;&#x606F;
figure;
imshow(faik);
imwrite(faik,'d=20tie.tif');

3.TIE&#x65B9;&#x7A0B;&#x6240;&#x5F97;&#x76F8;&#x4F4D;&#x4F5C;&#x4E3A;&#x89D2;&#x8C31;&#x8FED;&#x4EE3;&#x7B97;&#x6CD5;&#x521D;&#x59CB;&#x503C;&#x8FDB;&#x884C;&#x8FED;&#x4EE3;&#x6062;&#x590D;
clear all;
clc;
close all;

%% TIE&#x5F3A;&#x5EA6;&#x4F20;&#x8F93;&#x65B9;&#x7A0B;&#x8FDB;&#x884C;&#x76F8;&#x4F4D;&#x6062;&#x590D;
piesize=8e-3;%&#x50CF;&#x7D20;&#x5927;&#x5C0F;
L= 564*piesize;   %&#x76F8;&#x4F4D;&#x7269;&#x4F53;&#x7684;&#x957F;
W= 564*piesize;   %&#x76F8;&#x4F4D;&#x7269;&#x4F53;&#x7684;&#x5BBD; 512
lambda=632.8e-6 ;%&#x5149;&#x6E90;&#x6CE2;&#x957F;
k=2*pi/lambda;
d=20;%&#x884D;&#x5C04;&#x8DDD;&#x79BB;

I1=im2double(imread('1d=10.tif'));
I2=im2double(imread('1d=20.tif'));
I3=im2double(imread('1d=30.tif'));
diaotaz=10;%&#x884D;&#x5C04;&#x56FE;&#x4E4B;&#x95F4;&#x7684;&#x8DDD;&#x79BB;
D=(I3-I1)./(2*diaotaz);

[x, y, ~] = size(I2);              %size&#x8FD4;&#x56DE;&#x884C;&#x6570;&#x548C;&#x5217;&#x6570;&#x3002;r_dim&#x4E3A;&#x884C;&#x6570;&#xFF0C;c_dim&#x4E3A;&#x5217;&#x6570;&#xFF0C;~&#x5360;&#x4F4D;&#xFF0C;&#x8868;&#x793A;&#x53EA;&#x8981;&#x884C;&#x548C;&#x5217;&#x7684;&#x503C;
fX = [0:fix(x/2),ceil(x/2)-1:-1:1]/L;%fix&#x5411;&#x4E0B;&#x53D6;&#x6574;&#xFF0C;ceil&#x5411;&#x4E0A;&#x53D6;&#x6574;  %linspace(-x/2,x/2-1,x)/L;
fY = [0:fix(y/2),ceil(y/2)-1:-1:1]/L;%linspace(-y/2,y/2-1,y)/L;%
[fy,fx] = meshgrid(fY,fX);

q=fx.^2+fy.^2;
pesai=ifft2(q).*fft2(k.*D);

H=exp(1j*k*d.*sqrt(1-(lambda*lambda).*(q)));
HB=1./H;

a=ifft2(gradient((gradient(pesai))./I2));
a=a/max(max(a));

m=ifft2(q);
phase=-m.*a;
phase=phase/max(max(phase));

EO=I2.*exp(1j.*phase);
Ei=ifft2((fft2(EO)).*HB);
faik=angle(Ei);
faik=abs(faik);
faik(find(faik==0))=0.01;%&#x53BB;&#x9664;&#x77E9;&#x9635;&#x4E2D;&#x7B49;&#x4E8E;0&#x7684;&#x70B9;

faik=faik/max(max(faik));
% faik=sqrt(faik);
faik=mat2gray(faik);%%&#x5229;&#x7528;TIE&#x5F3A;&#x5EA6;&#x4F20;&#x8F93;&#x65B9;&#x7A0B;&#x8BA1;&#x7B97;&#x5F97;&#x5230;&#x7684;&#x76F8;&#x4F4D;&#x4FE1;&#x606F;
figure;
imshow(faik);
imwrite(faik,'d=20tie.tif');

%% &#x52A0;&#x901F;&#x89D2;&#x8C31;&#x8FED;&#x4EE3;&#x6CD5; &#x5F00;&#x59CB;&#x8FED;&#x4EE3; tie&#x6062;&#x590D;&#x7684;&#x76F8;&#x4F4D;&#x4F5C;&#x4E3A;&#x89D2;&#x8C31;&#x7684;&#x8F93;&#x5165;&#x76F8;&#x4F4D;&#x8FED;&#x4EE3;

step=300;
loss=ones(step,1);%MSE
psn=zeros(step,1);%psnr
N=564;%
gk=zeros(N,N);
minloss=1;
%% &#x8BFB;&#x5165;
A0=I2;
%A0=sqrt(A0);
%A0=A0./max(max(A0));
A=ones(N,N);
phasek=2*pi.*rand(N,N);
phasek1=phasek;
Ei=A.*exp(1j.*faik);%&#x521D;&#x59CB;&#x7684;&#x7269;&#x9762;
figure;
tic
for n=1:step
    EOO=ifft2((fft2(Ei)).*H);
    AOO=abs(EOO).^2;
    AOO=AOO./max(max(AOO));
    EO=A0.*exp(1j.*angle(EOO));%&#x65B0;&#x76F8;&#x4F4D; &#x50CF;&#x9762;
    Eii=ifft2((fft2(EO)).*HB);
    faik=angle(Eii);  %&#x65B0;&#x76F8;&#x4F4D; &#x7269;&#x9762;
    faik=faik./max(max(faik));
    beitak=(phasek-phasek1);
    %abk=(A0-AOO)./pi./2;
    if n>1
       gk1=gk;
       gk=faik-phasek;
       rk=sum((gk.*gk1),"all")/(sum((gk1.^2),"all"));%abs
       phasek1=phasek;
       phasek=faik+beitak*rk;
       phasek=phasek./max(max(phasek));
    else
        gk=faik-phasek;
        phasek=faik;
    end

    Ei=exp(1j*phasek);
    loss(n)=immse(A0,AOO);
    psn(n)= 10 * log10(1/loss(n));
   imshow(faik);
    if loss(n)<minloss imwrite(faik,fullfile([num2str(loss(n)) '.tif'])) end minloss="min(loss);" toc figure; imshow(a0); title('原图'); imshow(aoo); title('恢复'); faik="im2uint8(faik);" figure,imshow(faik); % imshow(abs(eo)); imshow(angle(ei)); imwrite(faik,'tie+jp_d="20.tif')</code"></minloss>
4.GS&#x7B97;&#x6CD5;&#x6240;&#x5F97;&#x76F8;&#x4F4D;&#x4F5C;&#x4E3A;&#x89D2;&#x8C31;&#x8FED;&#x4EE3;&#x7B97;&#x6CD5;&#x521D;&#x59CB;&#x503C;&#x8FDB;&#x884C;&#x8FED;&#x4EE3;&#x6062;&#x590D;&#xFF1B;
close all;clear all;clc; %
iterative=1000;            %&#x8BBE;&#x8FED;&#x4EE3;&#x6B21;&#x6570;&#x4E3A;300&#x6B21;&#x5427;
imagename='1d=20.tif';    %&#x4F60;&#x60F3;&#x8981;&#x63D0;&#x53D6;&#x76F8;&#x4F4D;&#x7684;&#x56FE;&#x50CF;&#x540D;&#x79F0;
phaseimage='1.tif';  %&#x8981;&#x4FDD;&#x5B58;&#x7684;&#x76F8;&#x4F4D;&#x56FE;&#x50CF;&#x540D;&#x79F0;
figure(1),imshow(imagename);
%&#x7A7A;&#x57DF;&#x8F93;&#x5165;&#x56FE;&#x50CF;&#x7684;&#x5E45;&#x5EA6;&#xFF08;&#x662F;&#x5DF2;&#x77E5;&#x7684;&#xFF0C;&#x4E5F;&#x5C31;&#x662F;&#x6E05;&#x6670;&#x7684;&#x56FE;&#x50CF;&#xFF0C;&#x5B83;&#x7684;&#x7070;&#x5EA6;&#x5C31;&#x662F;&#x5E45;&#x503C;&#xFF09;&#x548C;&#x76F8;&#x4F4D;&#x56FE;&#x50CF;&#xFF08;&#x5F85;&#x6062;&#x590D;&#xFF09;
known_abs_spatial=imread(imagename);            %&#x4F5C;&#x4E3A;&#x8F93;&#x5165;&#x56FE;&#x50CF;&#x7684;&#x5E45;&#x5EA6;&#xFF0C;&#x662F;&#x5DF2;&#x77E5;&#x7684;
%known_abs_spatial =rgb2gray(known_abs_spatial);%&#x6CE8;&#x610F;&#x8981;&#x7528;&#x5355;&#x901A;&#x9053;&#x56FE;&#x50CF;&#x505A;&#x5B9E;&#x9A8C;&#xFF0C;&#x5982;&#x679C;&#x4F60;&#x8BFB;&#x53D6;&#x7684;&#x662F;&#x5F69;&#x8272;&#x56FE;&#x50CF;&#xFF0C;&#x90A3;&#x5C31;&#x5427;&#x8FD9;&#x884C;&#x53D6;&#x6D88;&#x6CE8;&#x91CA;&#x53D8;&#x6210;&#x7070;&#x5EA6;&#x56FE;&#x50CF;&#x5427;
known_abs_spatial=im2double(known_abs_spatial); %&#x5C06;&#x56FE;&#x50CF;&#x7070;&#x5EA6;&#x6620;&#x5C04;&#x5230;0&#xFF5E;1
unknown_phase=known_abs_spatial;                %Peppers&#x56FE;&#x50CF;&#x4F5C;&#x4E3A;&#x8F93;&#x5165;&#x56FE;&#x50CF;&#x7684;&#x76F8;&#x4F4D;&#xFF0C;&#x4E5F;&#x5373;&#x4E3A;&#x5F85;&#x6062;&#x590D;&#x7684;&#x6570;&#x636E;&#xFF0C;
                                                %&#x8981;&#x6C42;&#x5B83;&#x548C;known_abs_spatial&#x5927;&#x5C0F;&#x4E00;&#x81F4;&#xFF0C;&#x6240;&#x4EE5;&#x8FD9;&#x91CC;&#x76F4;&#x63A5;&#x8D4B;&#x503C;&#x5C31;&#x597D;&#x4E86;
unknown_phase=im2double(unknown_phase);         %&#x5C06;&#x56FE;&#x50CF;&#x7070;&#x5EA6;&#x6620;&#x5C04;&#x5230;0&#xFF5E;1
unknown_phase2=unknown_phase*2*pi;              %&#x76F8;&#x4F4D;&#x8303;&#x56F4;&#x6620;&#x5C04;&#x5230;0-2*pi
unknown_phase2(unknown_phase2>pi)=unknown_phase2(unknown_phase2>pi)-2*pi;%&#x8FDB;&#x4E00;&#x6B65;&#x6620;&#x5C04;&#x81F3;[-pi,+pi]
[width,length]=size(known_abs_spatial);         %&#x83B7;&#x53D6;&#x56FE;&#x50CF;&#x7684;&#x5927;&#x5C0F;
input=known_abs_spatial.*exp(1i*unknown_phase2); %&#x6700;&#x7EC8;&#x8F93;&#x5165;&#x56FE;&#x50CF;:&#x5E45;&#x5EA6;*e^(i*&#x76F8;&#x4F4D;&#x89D2;&#x5EA6;)&#xFF0C;&#x5B83;&#x662F;&#x590D;&#x6570;&#x56FE;&#x50CF;
known_abs_fourier=abs(fft2(input));             %&#x5148;&#x5C06;input&#x56FE;&#x50CF;&#x8FDB;&#x884C;&#x5085;&#x7ACB;&#x53F6;&#x53D8;&#x6362;&#xFF0C;&#x7136;&#x540E;&#x53D6;&#x6A21;&#xFF0C;&#x5C31;&#x662F;&#x5085;&#x6C0F;&#x53D8;&#x6362;&#x540E;&#x7684;&#x5E45;&#x5EA6;
%&#x4EE5;&#x4E0B;&#x5F00;&#x59CB;&#x8FED;&#x4EE3;&#x6C42;&#x76F8;&#x4F4D;
phase_estimate=pi*rand(width,length);           %&#x8FD9;&#x662F;&#x751F;&#x6210;&#x4E86;&#x4E00;&#x526F;&#x5927;&#x5C0F;&#x4E3A;(width*length)&#x7684;&#x56FE;&#x50CF;
                                                %&#x5B83;&#x7684;&#x50CF;&#x7D20;&#x503C;&#x662F;&#x5728;[0,pi]&#x8303;&#x56F4;&#x5185;&#x968F;&#x673A;&#x751F;&#x6210;&#x7684;&#x3002;
figure(2),imshow(phase_estimate)
%&#x4EE5;&#x4E0B;&#x5F00;&#x59CB;&#x8FED;&#x4EE3;
for p=1:iterative
    signal_estimate_spatial=known_abs_spatial.*exp(1i*phase_estimate);   %Step 1  &#x6784;&#x9020;estimated signal&#xFF1A;&#x8FD8;&#x662F;&#x5E45;&#x5EA6;*e^(i*&#x76F8;&#x4F4D;&#x89D2;&#x5EA6;)&#x53D8;&#x6210;&#x590D;&#x6570;&#x5F62;&#x5F0F;
    temp1=fft2(signal_estimate_spatial);                                %&#x5085;&#x7ACB;&#x53F6;&#x53D8;&#x6362;&#x5230;&#x9891;&#x57DF;
    temp_ang=angle(temp1);                                              %&#x6C42;&#x76F8;&#x4F4D;&#x5F27;&#x5EA6;&#xFF0C;&#x5B83;&#x7684;&#x8303;&#x56F4;&#x662F;[-pi,pi]
    signal_estimate_fourier=known_abs_fourier.*exp(i*temp_ang);         %Step 2  &#x66FF;&#x6362;&#x5085;&#x6C0F;&#x53D8;&#x6362;&#x540E;&#x7684;&#x5E45;&#x5EA6;&#xFF0C;&#x4EA7;&#x751F;estimate Fourier transform
    temp2=ifft2(signal_estimate_fourier);                               %Step 3  &#x5BF9;Step 2&#x4EA7;&#x751F;&#x7684;estimate Fourier transform&#x8FDB;&#x884C;&#x5085;&#x7ACB;&#x53F6;&#x53CD;&#x53D8;&#x6362;&#xFF0C;&#x53C8;&#x53D8;&#x6362;&#x5230;&#x7A7A;&#x57DF;&#x4E86;
    phase_estimate=angle(temp2);                                        %Step 4:estimated phase
%     IS=abs(abs(temp2)-abs(temp1)).^2;
%     MSE=sum(IS(:))/256^2%&#x8BA1;&#x7B97;&#x5747;&#x65B9;&#x8BEF;&#x5DEE;

end
%&#x4EE5;&#x4E0A;&#x5FAA;&#x73AF;&#x5C31;&#x662F;&#x901A;&#x8FC7;&#x968F;&#x4FBF;&#x9884;&#x8BBE;&#x4E00;&#x4E2A;&#x76F8;&#x4F4D;&#x56FE;&#x50CF;&#xFF0C;&#x5728;&#x5FAA;&#x73AF;&#x4E2D;&#x4E0D;&#x65AD;&#x8C03;&#x6574;&#x903C;&#x8FD1;&#x771F;&#x5B9E;&#x7684;&#x76F8;&#x4F4D;&#xFF0C;&#x76F4;&#x5230;&#x6EE1;&#x8DB3;&#x6761;&#x4EF6;&#xFF08;&#x4E5F;&#x5C31;&#x662F;&#x6211;&#x4EEC;&#x6C42;&#x7684;&#x76F8;&#x4F4D;&#x548C;&#x771F;&#x5B9E;&#x76F8;&#x4F4D;&#x975E;&#x5E38;&#x63A5;&#x8FD1;&#x7684;&#x65F6;&#x5019;&#xFF09;
%&#x4E0D;&#x8FC7;&#x8FD9;&#x91CC;&#x6211;&#x4EEC;&#x53EA;&#x9700;&#x8981;&#x8BBE;&#x5B9A;&#x4E00;&#x4E2A;&#x6BD4;&#x8F83;&#x5927;&#x7684;&#x5FAA;&#x73AF;&#x5C31;&#x53EF;&#x4EE5;&#x4E86;&#xFF0C;&#x57FA;&#x672C;&#x4E0A;&#x90FD;&#x53EF;&#x4EE5;&#x6EE1;&#x8DB3;&#x6761;&#x4EF6;&#x4E86;&#xFF0C;&#x8FD9;&#x4E2A;&#x6FC0;&#x5149;&#x539F;&#x7406;&#x5C31;&#x8BB2;&#x8FC7;&#x4E86;&#x3002;
phase_estimate(phase_estimate<0)=phase_estimate(phase_estimate<0)+2*pi; 512 %把estimate_phase从[-pi,+pi],映射到[0,2pi] retrieved="phase_estimate/(2*pi);%&#x518D;&#x6620;&#x5C04;&#x5230;[0,1]" % is="abs(abs(temp2)-abs(temp1)).^2;" mse1="sum(IS(:))/256^2%&#x8BA1;&#x7B97;&#x5747;&#x65B9;&#x8BEF;&#x5DEE;" figure(2);plot(log10(mse),'linewidth',1.5); xlabel('iterative number');%迭代的次数 ylabel('logarithm of mean square error');%均方误差的对数 figure (3) imshow(retrieved,[]);title('相位图像')%显示我们提取到的相位图像 a="min(min(retrieved));" imwrite(retrieved,phaseimage) uz="known_abs_spatial.*exp(1j.*retrieved);" piesize="8e-3;%&#x50CF;&#x7D20;&#x5927;&#x5C0F;" l="564*piesize;" %相位物体的长 w="564*piesize;" %相位物体的宽 lambda="632.8e-6" ;%光源波长 k="2*pi/lambda;" d="20;%&#x884D;&#x5C04;&#x8DDD;&#x79BB;" [x, y, ~]="size(known_abs_spatial);" %size返回行数和列数。r_dim为行数,c_dim为列数,~占位,表示只要行和列的值 fx="[0:fix(x/2),ceil(x/2)-1:-1:1]/L;%fix&#x5411;&#x4E0B;&#x53D6;&#x6574;&#xFF0C;ceil&#x5411;&#x4E0A;&#x53D6;&#x6574;" %linspace(-x 2,x 2-1,x) l; fy="[0:fix(y/2),ceil(y/2)-1:-1:1]/L;%linspace(-y/2,y/2-1,y)/L;%" [fy,fx]="meshgrid(fY,fX);" q="fx.^2+fy.^2;" h="exp(1j*k*d.*sqrt(1-(lambda*lambda).*(q)));" hb="1./H;" eii="ifft2((fft2(Uz)).*HB);" phase1="angle(Eii);" phase1(find(phase1="=0))=0.01;" imshow(phase1,[]); %% 加速角谱迭代法 开始迭代 gs恢复的相位作为角谱的输入相位迭代 step="1000;" loss="ones(step,1);%MSE" psn="zeros(step,1);%psnr" n="564;%" gk="zeros(N,N);" minloss="1;" 读入 a0="known_abs_spatial;" %a0="sqrt(A0);" phasek="retrieved;" phasek1="phasek;" ei="A.*exp(1j.*phase1);%&#x521D;&#x59CB;&#x7684;&#x7269;&#x9762;" figure; tic for eoo="ifft2((fft2(Ei)).*H);" aoo="abs(EOO).^2;" eo="A0.*exp(1j.*angle(EOO));%&#x65B0;&#x76F8;&#x4F4D;" 像面 faik="angle(Eii);" %新相位 物面 beitak="(phasek-phasek1);" %abk="(A0-AOO)./pi./2;" if>1
       gk1=gk;
       gk=faik-phasek;
       rk=sum((gk.*gk1),"all")/(sum((gk1.^2),"all"));%abs
       phasek1=phasek;
       phasek=faik+beitak*rk;
       phasek=phasek./max(max(phasek));
    else
        gk=faik-phasek;
        phasek=faik;
    end

    Ei=exp(1j*phasek);
    loss(n)=immse(A0,AOO);
    psn(n)= 10 * log10(1/loss(n));
   imshow(faik);
    if loss(n)<minloss imwrite(faik,fullfile([num2str(loss(n)) '.tif'])) end minloss="min(loss);" toc figure; imshow(a0); title('原图'); imshow(aoo); title('恢复'); faik="im2uint8(faik);" figure,imshow(faik); % imshow(abs(eo)); imshow(angle(ei)); imwrite(faik,'gs+jp_1d="20.tif')" < code></minloss></0)=phase_estimate(phase_estimate<0)+2*pi;>

Original: https://blog.csdn.net/qq_44366923/article/details/124728547
Author: little bur baby
Title: 图像处理——相位恢复(GS,TIE,改进型角谱迭代法)(已更新代码)

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/631928/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球