该博文主要以12张三频率的四步相移光栅图像生成为例:
关于四步相移以及多步相移法的解相可以参考我的另一篇博文的公式详细推导,在解相完成后即可进行相位展开。
(独家原创)多步相移法解相位详细推导
(独家原创)多步相移法解相位详细推导_视觉小新的博客-CSDN博客_12步相移法
相移法原理已经清楚,多频外差进行解相的原理也清楚后,那我们如何下手去实现呢?先从投射光栅图像的生成开始。
以12张三频率的四步相移光栅图像生成为例:
首先光栅图像是对二维数据进行操作,所以需要新建空的矩阵来存储图像,同时设置图像的尺寸height和width,分别对应投影仪的分辨率。
首先说明的是论文中所看到的的三套条纹图案其实就是三个频率的图像。
三个频率这里设置为73 64 56。
这三个频率的含义是在光栅条纹的条纹方向上有多少个正弦条纹。
重点来了!
如何控制不同的频率和不同的相位在图案上进行显示呢?换句话说,
投影的光栅条纹图像强度分布公式如何在代码中体现呢?
测量中不存在相移误差(不会有多余的相移加入,按理论计算),且背景光强与条纹对比度均为常数 0.5,对应如下式表示:
I(x,y) =0.5+0.5cos(2*pi*y*f/(heigth)+n*pi2/N);
这里你应该会有疑问,即
需要解释的是这里用的是cell元胞来进行存储图像数据,相当于二维数据里的每一个元素仍然是个二维数据,每个元素都是一张生成图案。
(1)因为是四步相移,N=4,n-1用j表示,从0~3;
(2)f对频率进行控制,q控制条纹的方向为横向。
(3)这个公式里的2*pi*q*f(i)/(heigth),f(i)/(heigth)为正弦函数的频率,周期是指(heigth)/f(i),一个正弦函数有多少个像素长度,倒数为频率,这也是与多频中频率含义的不同之处。
个人理解,条纹在产生时的频率是和图像的尺寸有关,如果改变正弦条纹本身周期内的像素个数,即改变了它的周期数,频率也会改变,但是图像尺寸确定后条纹的周期不变,频率不变,这只是针对条纹的产生而言,如果投影仪投射出去,无论拍摄相机的分辨率如何变化,在展开相位时均与不同帧图像的相同像素位置的相差有关。
for i = 1:3 % 控制三种不同的频率
for j = 0:3 % 控制四步相移
for k = 1:width
for q=1:heigth
Ce{i,j+1}(k,q) =0.5+0.5*cos(2*pi*q*f(i)/(heigth)+j*pi/2);
end
end
end
end
完整的代码段(包括生成和存储)如下:
%%%投影3套共12幅条纹图
%%%三频分别为73 64 56
clc;
clear all;
Ce = cell(3,4);
f= [73 64 56];
width =1080;
heigth =1920;
%先
for i=1:3
for j=1:4
Ce{i,j} = zeros(width,heigth);
end
end
for i = 1:3 % 控制三种不同的频率
for j = 0:3 % 控制四步相移
for k = 1:width
for q=1:heigth
Ce{i,j+1}(k,q) =0.5+0.5*cos(2*pi*q*f(i)/(heigth)+j*pi/2);
end
end
end
end
for i = 1:3 %循环存储12幅投影条纹图
for j=1:4
tmp=Ce{i,j};
if i==1
filename=['C:\Users\Administrator\Desktop\111\',num2str(j),'.bmp'];
elseif i>1
filename=['C:\Users\Administrator\Desktop\111\',num2str(2.^(i)+j),'.bmp'];
end
imwrite(tmp,filename,'bmp');
end
end
效果图为: