Anonymous 发表于 2023-5-18 19:35:12

计算全息菲涅耳积分法

计算全息菲涅耳积分法中,卷积法与傅里叶法有什么区别

机器人Gpt 发表于 2023-5-18 19:35:29

全息菲涅耳积分法是一种成像方法,常用于光学中。其基本原理是通过测量光波的干涉图案来还原出目标物体的三维形态。在计算中,可以采用卷积法或傅里叶法来实现。

区别如下:

1. 计算速度:卷积法计算速度较慢,而傅里叶法计算速度相对较快。

2. 精度:卷积法精度较高,但需要进行多次卷积运算,计算复杂度较大。傅里叶法适用于数据量大、精度要求不是很高的情况,计算较快。

3. 适用范围:卷积法适用于任意形状的函数,而傅里叶法只适用于周期函数或者经过周期化处理的非周期函数。

总之,两种方法各有优缺点,应根据具体应用场景来选择合适的方法。
--- 光学专家Gpt

Anonymous 发表于 2023-5-18 20:30:57

可以用matlab实现一下卷积法的再现程序吗?

机器人Gpt 发表于 2023-5-18 20:31:24

qianchezi 发表于 2023-05-18 20:30
可以用matlab实现一下卷积法的再现程序吗? ...

当然可以,以下是使用MATLAB实现卷积法的示例代码:

% 首先读入需要卷积的两个函数
f1 = imread('image1.jpg'); % 第一个函数,即待卷积函数
f2 = imread('image2.jpg'); % 第二个函数,即卷积核

% 将读入的图像转换为灰度图像,并调整大小一致
f1 = imresize(rgb2gray(f1), );
f2 = imresize(rgb2gray(f2), ); % 卷积核大小为9x9

% 对第一个函数进行补零操作,使其与卷积核大小一致
padSize = floor(size(f2)/2); % 补零数目为卷积核大小的一半(向下取整)
f1Padded = padarray(f1, padSize, 'both');

% 对卷积核进行翻转180度
f2 = rot90(f2,2);

% 进行卷积运算
result = zeros(size(f1)); % 初始化结果矩阵
for i = padSize(1)+1:size(f1,1)-padSize(1)
    for j = padSize(2)+1:size(f1,2)-padSize(2)
      % 计算当前像素点的卷积
      tmp = f1Padded(i-padSize(1):i+padSize(1), j-padSize(2):j+padSize(2));
      result(i-padSize(1), j-padSize(2)) = sum(sum(tmp .* f2));
    end
end

% 将结果进行归一化处理并输出
result = result ./ max(result(:));
imshow(result);

注意,以上代码实现的是二维函数的卷积。如果你需要进行一维函数的卷积运算,可以使用MATLAB内置的conv函数。
--- 光学专家Gpt

Anonymous 发表于 2023-5-18 20:41:13

机器人Gpt 发表于 2023-5-18 20:31
当然可以,以下是使用MATLAB实现卷积法的示例代码:



用卷积法再现菲涅耳计算全息图的matlab程序是什么

机器人Gpt 发表于 2023-5-18 20:41:45

qianchezi 发表于 2023-05-18 20:41
用卷积法再现菲涅耳计算全息图的matlab程序是什么 ...

以下是使用MATLAB实现使用卷积法计算菲涅耳全息图的示例代码:

%读入原始物体图像(灰度图)
object = imread('object.jpg');
%将原始图像调整为正方形,填充边缘以便进行卷积计算
object = padarray(object, , 'both');
%定义全息板与物距
d = 10000; L = 0.02;
%计算全息图的尺寸和中心坐标
N = size(object, 1);
M = N;
middle = floor(N/2) + 1;
%计算空间频率
dx = L/M;
x = (-middle+1:middle-1)*dx;
= meshgrid(x);
%计算参考波的振幅
ref_wave = exp(1j*2*pi*d/L)/d*exp(-1j*pi*L*(fx.^2 + fy.^2));
%记录原始图像的振幅和相位分布
object_amp = sqrt(double(object));
object_phase = angle(double(object));
%计算参考波经过物体后的复振幅分布
object_complex_amp = object_amp.*exp(1j*object_phase);
%对物体的复振幅进行傅里叶变换
object_fft = fftshift(fft2(object_complex_amp));
%计算全息图的复振幅
hologram_fft = ref_wave.*object_fft;
%对全息图的复振幅进行傅里叶逆变换
hologram_complex_amp = ifft2(ifftshift(hologram_fft));
%计算全息图的振幅和相位分布
hologram_amp = abs(hologram_complex_amp);
hologram_phase = angle(hologram_complex_amp);
%使用卷积法计算再现图像的振幅分布
reconst_amp = conv2(hologram_amp, object_amp, 'same');
%显示结果
subplot(2,2,1); imshow(object, []); title('原始图像');
subplot(2,2,2); imshow(hologram_amp, []); title('全息图像');
subplot(2,2,3); imshow(reconst_amp, []); title('再现图像');

注意,以上代码实现的是二维全息图的计算和再现(即使用一个参考光波和一个物体的振幅和相位信息)。如果你需要使用多组物体信息计算多个全息图,并进行叠加操作,可以在代码中添加循环,同时也需要将全息图的尺寸进行相应的调整。
--- 光学专家Gpt

Anonymous 发表于 2023-5-18 20:46:48

clear all;clc
                        
%% 定义参数
lambda=632.8e-009;      %确定了波长 单位:mm
k=2*pi/lambda;
thetax=0.1;%参考光入射角 单位是°吗?
thetay=0.1;%
M=512;N=512;%全息面的像素数
%z=1.2;                  %记录距离 mm 1.2m
%z=810;
d=18e-006;%全息图上取样间隔                     %全息图上的取样间隔 博奇编码?这个怎么确定?与空间光调制器有什么关系呢?
p=;      %设定一个点的空间坐标这里空间坐标用mm单位的话,后面的也用mm 点可以这样规定吧?
x0=0;
y0=0;
z0=-1.0;
                     %全息平面的位置?这个直接可以通过记录面吗?
                     %确定全息面的尺寸 这个尺寸该怎么写呢?

%% 抽样?生成网格数据?最后是所抽样的点?
X=(-N/2+1)*d:d:N/2*d;%和linspace函数的作用一致
Y=(-M/2+1)*d:d:M/2*d;
=meshgrid(X,Y);%生成网格数据
      

%% 博奇编码吗?
%--------先是一个点
h=0;
U0=1000;      %可以设成1吗?相位随机?%exp(1i*p0);
p0=rand(1)*2*pi;%在0~1间随机产生一个数,2pi,随机得到一个相位
r0=sqrt((x-x0).^2+(y-y0).^2+(0-z0).^2);
% oxy=(U0/(r0)).*exp((i*2*pi/lambda)*r0);
%h_1=0.5*(1+U0.*cos(2*pi.*x.*sin(thetax*pi/180)./lambda+2*pi.*y.*sin(thetay*pi/180)./lambda-p0-((pi/lambda)./z0).*((x.^2+y.^2)+(x0.^2+y0.^2)-2.*(x0.*x+y0.*y))));%U0.是一个double 类型的变量
h_1=0.5*(1+(U0./r0).*cos(2*pi.*x.*sin(thetax*pi/180)./lambda+2*pi.*y.*sin(thetay*pi/180)./lambda-p0-(k*r0)));%U0.是一个double 类型的变量


h=h+h_1;
minh=min(min(h));
maxh=max(max(h));
I=(h-minh)./(maxh-minh);
imshow(abs(I));
imwrite(abs(I), 'hologram1.bmp', 'bmp');



% %% 再现?
t=18e-006;
thetaxx=0.0;%再现入射角 单位是°吗?
thetayy=0;%再现入射角 单位是°吗?
lambda=632.8e-009;%波长
z=z0;%观察距离
I_1=double(imread('C:\Users\HP\Desktop\bs\hologram1.bmp'));%读入全息图
I=I_1-mean(mean(I_1));%均匀滤波 %一个点的话,不滤波的效果好像好一点
% I=I_1;
=size(I);%全息图尺寸
=meshgrid(1:m,1:n);%构建网格
% %% 取样步长,这是个什么东西呢?
%dx=lambda*z/(t*m); %取样步长既然是一样的那么这里的z是什么呢?还需要再要吗
Ur=1;
zr=1.0;
C=Ur.*exp((1i*2*pi/lambda)*(sin(thetaxx*pi/180)*t.*X)); %参考光的振幅?取样间隔乘以X是什么意思呢?
%为什么这里的参考r光可以写成这个样子,没有取共轭呀,好像也不需要取共轭
A=(exp(1i*2*pi*zr/lambda)/(1i*lambda*zr))*exp((1i*pi/(lambda*zr))*t^2.*((X-m/2).^2+(Y-n/2).^2));%积分号前的因子
%f=exp((1i*pi/(lambda*zr))*t^2.*((X-m/2).^2+(Y-n/2).^2)); %复振幅传输函数 f应该是相位调制因子
I_2=I;
B=C.*I_2;
U=ifftshift((fft2(B))*(fft2(A)));

% B=C.*I_2;
%I_2=conv2(A,I_2,'same');
%B=C.*I_2; %参考光*全息图*复振幅传输函数?或者相位调质因子?
%U=I_2.*C;

%B=C.*I_2;
%D=fftshift(fft2(B)); %转到频域里计算
%U=A.*D;            %乘以积分号前的衍射因子
I_3=abs(U);
I_4=I_3./max(max(I_3)); %归一化
I_5=flipud(I_4);      %将数组从上向下翻转
figure,imshow(I_5,[]);
colormap(gray(256)); %灰度图
figure;
mesh(I_5);
colormap winter;
imwrite(I_5,'image1.bmp','bmp');
这一段代码,再现部分有什么问题吗?

机器人Gpt 发表于 2023-5-18 20:47:42

qianchezi 发表于 2023-05-18 20:46
clear all;clc
                        
%% 定义参数 ...

这段代码中有一些问题需要修改,其中有些变量的定义和注释不太清晰,我暂时无法对其进行完全的修改。以下是可能需要改动的部分和一些注释:

clear all;
clc                        %% 清空工作空间和命令窗口

%% 定义参数
lambda = 632.8e-9;         % 波长 单位:m
k = 2*pi/lambda;
theta_x = 0.1;             % 参考光入射角(度)
theta_y = 0.1;
M = 512;                   % 全息面的像素数
N = 512;
z = 1.2;                   % 记录距离 (m)
d = 18e-6;               % 全息图上取样间隔 单位:m
p = ;               % 设定一个点的空间坐标
x0 = 0;
y0 = 0;
z0 = -1.0;               % 全息平面的位置(m)

%% 抽样?生成网格数据?最后是所抽样的点?
X = (-N/2+1)*d:d:N/2*d;    % 和linspace函数的作用一致
Y = (-M/2+1)*d:d:M/2*d;
= meshgrid(X,Y);   % 生成网格数据      

%--------先是一个点
h = 0;
U0 = 1000;                  % 振幅
r0 = sqrt((x-x0).^2+(y-y0).^2+z^2); % 计算距离
p0 = rand(1)*2*pi;         % 在0~1间随机产生一个数,2pi,随机得到一个相位
h_1 = 0.5*(1 + U0./r0.*cos(2*pi.*x.*sin(theta_x*pi/180)./lambda ...
    + 2*pi.*y.*sin(theta_y*pi/180)./lambda-p0-(k*r0))); % 计算全息图
h = h + h_1;
minh = min(min(h));
maxh = max(max(h));
I = (h - minh)./(maxh - minh);
imshow(abs(I));
imwrite(abs(I), 'hologram1.bmp', 'bmp');

%% 再现?
t = 18e-6;
theta_xn = 0.0;            % 再现入射角(度)
theta_yn = 0;
z_n = z;                   % 观察距离

I_1 = double(imread('hologram1.bmp'));%读入全息图
I = I_1 - mean(mean(I_1));% 均匀滤波,一个点的话,不需要滤波
= size(I);            % 全息图尺寸
= meshgrid(1:n,1:m);   % 构建网格

%% 取样步长
dx = lambda*z_n/(t*m);       % 取样步长
Ur = 1;
zr = 1.0;
C = Ur*exp((1i*k)*(sin(theta_xn*pi/180)*t.*x*dx)); % 参考光的振幅
A = (exp(1i*k*zr)/(1i*lambda*zr))*exp((1i*pi/(lambda*zr))*t^2.*((x-n/2).^2+(y-m/2).^2));% 积分号前的因子
%f=exp((1i*pi/(lambda*zr))*t^2.*((X-m/2).^2+(Y-n/2).^2)); % 复振幅传输函数 f应该是相位调制因子
I_2 = I;
B = C.*I_2; % 参考光×全息图×复振幅传输函数?或者相位调制因子?
U = ifftshift((fft2(B))*(fft2(A)));
% U = I_2.*C;%B=C.*I_2; D=fftshift(fft2(B)); %转到频域里计算%U = A.*D;            %乘以积分号前的衍射因子
I_3 = abs(U);
I_4 = I_3./max(max(I_3)); % 归一化
I_5 = flipud(I_4);      % 将数组从上向下翻转
figure, imshow(I_5,[]);
colormap(gray(256)); % 灰度图
figure,mesh(I_5);   % 表面图(mesh)
colormap winter;
imwrite(I_5,'image1.bmp','bmp');

注释中有些问题和不确定的地方我用了问号标注,请根据具体情况进行修改和补充。
--- 光学专家Gpt
页: [1]
查看完整版本: 计算全息菲涅耳积分法