傅里叶变换轮廓术原理和Matlab实现

傅里叶变换轮廓术

         傅里叶变换方法可用于干涉条纹的处理,用来检测光学元件的质量。在主动光学三维测量中,结构照明型条纹与干涉条纹具有类似的特征。1983 年M. Takeda和K. Mutoh将傅里叶变换用于三维物体面形测量,提出了傅里叶变换轮廓术(Fourier Transform Profilometry,FTP)。这种方法以罗奇光栅产生的结构光场投影到待测三维物体表面,得到被三维物体面形调制的变形光场成像系统将此变形条纹光场成像于面阵探测器上,然后用计算机对像的强度分布进行傅里叶分析、滤波和处理,得到物体的三维面形分布。在实际应用中,为了获得较高的测量精度,增加系统的分辨率,通常使用正弦光栅代替罗奇光栅。投射的正弦条纹如下图所示。

                                                                     

 

FTP主要步骤

 

                                                              

 

 

 傅里叶变换轮廓术原理推导

          ---------

 Matlab代码实现

主函数ftp.m

%%实验1,peaks函数,等待出现十字后在再使用
clear all %清理数据
close all %关闭所有图像窗口
N = 512; L = 800; d = 350;
p = 8; f0 = 1/p; %空间角频率2*π/p
a = 127.5; b = 127.5;
x = 0:1:N -1;
[X,Y] = meshgrid(x);
object =5.6* peaks(length(x));
I0 = a + b* cos(2* pi* f0* X);
I = a + b*cos(2* pi* f0* (X + ( d /L* object)));% 产生变形条纹
figure(1)
mesh(object); %原始图
title('高度图像');
% figure(2) %imshow函数均归一化处理
% imshow(I0/max(max(I0))); %标准正弦光
% title('标准正弦光');
% figure(3)
% imshow(I/max(max(I))); %调制后的正弦光
% title('调制后的正弦光');
F0 = fftshift(fft2(I0));
F = fftshift(fft2(I)); %二维傅里叶变换
rect_window_filter = zeros(size(F));
figure(4)
aa = mesh(abs(F)); %观察频谱被分开的情况
view(-39,22); %调整观察角度
title('频谱在一级已经被分开')
colormap(prism);%光谱着色
colorbar;
figure(5)
contour(abs(F),80); %80表示分割密度,准备选取窗口
title('FFT');
pause(1); %程序暂停1s,不然会有bug
r = round (getrect); %用鼠标选取滤波范围
rect_window_filter(r(2):r(4) + r(2),r(1):r(3) + r(1)) = 1; % 生成矩形滤波窗
Q = rect_window_filter.* F; Q0 = F0.* rect_window_filter; % 滤波
s0 = ifft2 (ifftshift (Q0 )); s = ifft2 (ifftshift(Q)); % 逆傅里叶变换
Deltaphi = atan2(imag( s.* conj( s0)),real( s.* conj(s0))); % 获取相位差信息
figure(6)
mesh(Deltaphi); % 未解包裹的相位
title('未解包裹');
up = uphase2d(Deltaphi);% 截断相位展开成连续相位
figure(7)
mesh(up); %解包裹的相位
title('解包裹');
recovery_object = L * up./(2 * pi * f0 * d-up); % 恢复物体高度
figure(8)
mesh(recovery_object);
title('复原的图像');
figure(9)
erro = abs(recovery_object-object);
erro_max = max(max(erro));
erro_mean = mean(erro,'all');
mesh(abs(recovery_object-object));
title('误差分布')
hold off

 

相位展开函数uphase2d.m

 1 function up = uphase2d(wp)
 2 %UPHASE2D 二维相位展开,输入wp,输出up;
 3 % 先展开第一行相位,然后以第一行各点为基准点,逐列展开,最后得到连续分布的二维相位;
 4 
 5     % 参数初始化
 6     [r,c] = size(wp);
 7     % 第一行的相位展开
 8     wp(1, :) = uphase1d(wp(1, :));
 9     for n = 1:c
10         %各列的相位展开
11         wp(:, n) = uphase1d(wp(:, n));
12     end
13     up = wp;
14 end

 

 

 

 

 

 

  部分参考资料:

   [1]光学测量技术与应用[M],冯其波  

   [2]傅里叶变换轮廓术的Matlab仿真实现[J],吴应山

   [3]https://blog.csdn.net/u010430651/article/details/95212540

 

posted @ 2023-03-20 15:20  路人加  阅读(1197)  评论(3编辑  收藏  举报