上一篇讲了傅里叶变换轮廓术的原理,这篇简单讲讲Matlab模拟傅里叶变换轮廓术(FTP)
由于部分代码我不是用Matlab写的,所以个别步骤我会跳过,但相关的操作百度一搜一大把,动起小手丰衣足食
条纹产生
FTP用到的都是正弦光栅条纹,用matlab生成正弦光栅条纹其实也很简单
f=1/18;%条纹频率,即18个像素一个周期
w=2*pi*f;%角频率
%条纹尺寸
x=1:150;
y=1:150;
[x,y]=meshgrid(x,y);
%条纹图样I
I=127.5+127.5*cos(w*x);%可在条纹中加相移
%I=127.5+127.5*cos(w*x-2*pi/3);%相移2pi/3的条纹
I=mat2gray(I);%转为灰度图显示
imshow(I);
目标物体
目标物体用大部分论文都用到的matlab的peak函数生成即可
%目标物体
z=3*peaks(150);
figure('name','目标');mesh(z);
变形条纹
将得到的正弦光栅条纹投影到目标物体上,这里是根据上一篇文章的高度和相位的几何关系, 反推相位和高度的关系
L=80;%摄像机出瞳到参考面的距离
d=15;%摄像机出瞳和投影仪出瞳的距离
I1=127.5+127.5*cos(w*(x+z*d./(L-z)));%纵向
I1=mat2gray(I1);
figure('name','变形图样');imshow(I1);
傅里叶变换+滤波+傅里叶逆变换
由于这一步我是用C++和OpenCV来写的,所以就不能贴源码了
主要是对变形图样做傅里叶变换,设计合适的滤波器滤出其中一半基频分量,再做逆变换后求相位,这些都可以在网上找到matlab的相应代码。
相位解包裹
经过上一步的操作,得到的是包裹相位,即相位被截断在[-π,π]之间,需要相位解包裹得到连续相位。
只要peak函数产生的高度不是设置得特别大,可以采用最简单的Itoh's method的一维解包裹方法来解包裹
基本思路是:
同一行前后两个点的相位作比较,如果后一个点的相位比前一个点的相位大π,则后一个点的相位减2π;
如果后一个点的相位比前一个点的相位小π,则后一个点的相位加π。
额······这步我同样没用matlab写,所以就不放源码了。
得到连续相位后,根据上面提到的高度相位关系就可以求出被测物体原高度了。