从条纹到三维:相移、相位展开、深度学习与激光线宽
把明暗条纹投到一个石膏头像上,相机能看到鼻梁、卷发和脸颊上的条纹发生变化。接下来怎么把这些亮度值变成三维坐标?
这件事最容易混淆的地方,是把“求出相位”“确定条纹编号”和“恢复三维位置”当成同一个步骤。再加上单帧解相、CNN、U-Net、MEMS 这些名词,原本的一条测量流程很快就变成了几组不相连的概念。
这篇从一个像素的亮度开始,把它们重新串起来。先手算四步相移,再解释相位展开和学习型解相,最后回到投影端:激光线为什么会把条纹抹平,条纹又为什么不是越密越好。只需要知道正弦、余弦描述周期变化,不需要先学过光学或神经网络。
先看整条测量流程
图中是功能流程,不是某一套装置的光路图。传统相移和学习型解相是两条可选路线;相位展开、几何标定仍需分别处理。
条纹投影轮廓术(Fringe Projection Profilometry,FPP)是一种结构光测量方法。投影器主动给物体加上已知规律的明暗标记,相机从另一个位置观察这些标记,再利用它们之间的几何对应关系恢复表面形状。
结构光(Structured Light)是更大的概念。正弦条纹、点阵、格雷码、随机散斑都可以作为光学编码。这里主要讨论正弦条纹。
普通照片的亮暗可能来自物体颜色、光照、阴影或反射方向,单凭亮度很难区分形状与材质。投影条纹增加了可控信息,但也不是“条纹弯多少,高度就等于多少”。相机、投影器的位置与成像关系必须通过标定确定。
一个像素里,A、B 和相位分别是什么
灰度图可以看成数值矩阵。一个像素(pixel)就是其中的一个采样位置,保存一个亮度数值。常见 8 位图像的数值范围是 0 到 255,但这不代表相机对这 256 个级别都能无误差地区分。
正弦条纹常用下面的模型表示:
\[ I(x,y)=A(x,y)+B(x,y)\cos\phi(x,y). \]对固定像素,省去坐标就是:
\[ I=A+B\cos\phi. \]A 是亮度基线,不是物体后面的背景墙
\(A\) 表示不随相移改变的平均亮度成分。它可以包含投影光的平均贡献和环境光。例如 \(I=100+40\cos\phi\),亮度围绕 100 上下变化。这个 100 就是基线。不同像素的 \(A\) 可以不同:白色表面、深色表面、阴影附近都可能有各自的平均亮度。
B 是明暗起伏的幅度
上述例子中,最亮为 140,最暗为 60。对于理想正弦信号:
\[ A=\frac{I_{\max}+I_{\min}}2,\qquad B=\frac{I_{\max}-I_{\min}}2. \] \(B\) 大,条纹明暗差明显;\(B\) 小,起伏接近噪声,相位就更难估计。“调制”这个词需要看定义。调制幅值是 \(B\),有亮度单位;常见的归一化对比度是 \(B/A\),没有单位。在非负理想正弦模型中:
\[ C=\frac{I_{\max}-I_{\min}}{I_{\max}+I_{\min}}=\frac BA. \]环境光会抬高 \(A\),即使 \(B\) 不变,对比度也会下降。因此,画面整体变亮不等于条纹信息更清楚。
相位描述周期内的位置
相位(phase)可以理解为沿着一个周期走到了哪里。它通常用弧度(radian,rad)表示:一圈是 \(2\pi\) rad,也就是 360°。
| 相位 | 余弦值 | 在正弦条纹中的位置 |
|---|---|---|
| 0 | 1 | 最亮处 |
| π/2 | 0 | 经过平均亮度,正在变暗 |
| π | −1 | 最暗处 |
| 3π/2 | 0 | 再次经过平均亮度,正在变亮 |
| 2π | 1 | 回到下一周期的最亮处 |
亮度相同,不代表相位相同。例如两次经过平均亮度,一个在下降,一个在上升。只看一个亮度值,无法分辨它们。
相位也不是高度本身。它首先帮助确定光学编码的位置,之后才能借助几何关系换成三维坐标。
相移:用几张照片,把未知量拆开
在一个像素上,只拍一张图得到一个 \(I\),却有 \(A\)、\(B\)、\(\phi\) 三个未知量。在没有额外约束时,一个方程不够。
多步相移的办法是:保持条纹疏密不变,只把整套条纹依次平移已知比例的周期,每移动一次就拍一张。
这里统一采用:
\[ \begin{aligned} I_n&=A+B\cos(\phi-\delta_n),\\ \delta_n&=\frac{2\pi n}{N},\\ n&=0,\ldots,N-1. \end{aligned} \] \(N\) 是相移步数,也就是这组相移图的张数。有些资料在相移量前使用加号,求解公式的符号也会跟着变化;不能把两套约定混着用。先手算四步相移
四次偏移分别是 0、π/2、π、3π/2。同一个像素的亮度为:
\[ \begin{aligned} I_0&=A+B\cos\phi,\\ I_1&=A+B\sin\phi,\\ I_2&=A-B\cos\phi,\\ I_3&=A-B\sin\phi. \end{aligned} \]相隔半个周期的两幅图相减:
\[ I_0-I_2=2B\cos\phi,\qquad I_1-I_3=2B\sin\phi. \]背景 \(A\) 消失了,而正弦、余弦分量都保留下来。因此:
\[ \phi_w=\operatorname{atan2}(I_1-I_3,\ I_0-I_2). \]举一个可以手算的例子。设 \(A=100\)、\(B=40\)、真实相位为 30°:
| 图像 | 亮度 |
|---|---|
| 第 0 张 | 134.641 |
| 第 1 张 | 120.000 |
| 第 2 张 | 65.359 |
| 第 3 张 | 80.000 |
两个差值约为 69.282 和 40,因此 \(\operatorname{atan2}(40,69.282)=30^\circ\)。
实际应用时不是整张图只算一次,而是对每个有效像素都执行类似计算,得到一张相位图。
为什么用 atan2,而不是普通 arctan
普通反正切接收比值 \(M/D\)。但第一象限与第三象限都可能给出正比值,因此会丢失象限信息。
\(\operatorname{atan2}(M,D)\) 同时接收两个带符号的分量,能判断向量朝向。常见程序接口的顺序是先纵向分量、再横向分量,不要写反。如果两个分量都为零,相位没有可靠定义。某些程序会返回数值 0,但那只是函数行为,不能解释成测出了零相位。
N 步公式中的 M、D 从哪里来
对均匀相移、\(N\geq3\) 的理想正弦模型,定义:
\[ M=\sum_{n=0}^{N-1}I_n\sin\delta_n,\qquad D=\sum_{n=0}^{N-1}I_n\cos\delta_n. \]展开余弦差角公式:
\[ I_n=A+B\cos\phi\cos\delta_n+B\sin\phi\sin\delta_n. \]在完整周期的等间隔取样下,正弦、余弦的和为零,交叉乘积的和也为零,平方和则是 \(N/2\)。把这些关系代入两个加权和,得到:
\[ M=\frac N2B\sin\phi,\qquad D=\frac N2B\cos\phi. \]相位、背景和调制幅值于是分别为:
\[ \begin{aligned} \phi_w&=\operatorname{atan2}(M,D),\\ A&=\frac1N\sum_{n=0}^{N-1}I_n,\\ B&=\frac2N\sqrt{M^2+D^2}. \end{aligned} \]后面讲深度学习时还会遇到 \(M\)、\(D\)。它们不是网络随意起名的输出,而是经典相移公式里的相位相关分量。
多拍几张的前提:这几张要对应同一个物点
上述推导默认同一组图像中,某个像素的 \(A\)、\(B\) 和物体相位基本不变。如果物体运动,同一个像素先看到鼻梁、后看到脸颊,几张图就不能再当作同一组未知量的观测。
因此,更多相移步数可能改善随机噪声,却也增加了采集时间和运动风险。步数不是越多越好。
相位算出来了,为什么还要展开
包裹相位只保留一圈
正弦和余弦满足周期性:给相位增加整数个 \(2\pi\),亮度不变。反三角函数因此只能返回主值,常用区间是 \((-\pi,\pi]\),具体端点约定随实现而异。
这个结果叫包裹相位(wrapped phase)。真实相位持续增加时,主值会在边界处突然跳回,看起来像锯齿。这种数值跳变不一定对应物体上的台阶。
要补回完整周期,写成:
\[ \Phi=\phi_w+2\pi k. \] \(k\) 是整数,叫条纹级次(fringe order)。\(\phi_w\) 告诉我们在一个周期里的位置,\(k\) 告诉我们是第几个周期。例如 \(\Phi=5\pi+\pi/4\),包裹后可以写成 \(-3\pi/4\),两者之间差三个完整周期。找回这个 3,就是相位展开要处理的问题。
空间展开:根据邻居判断跳变
空间相位展开(spatial phase unwrapping)利用相邻像素的连续性。若相邻点的真实相位变化足够小,突然出现接近 \(2\pi\) 的跳变,就可以考虑补回一个周期。
它不一定需要额外图案,但依赖空间条件:
- 台阶和陡峭表面可能存在真实大跳变。
- 遮挡、阴影和低信噪比区域可能切断可靠路径。
- 孤立物体之间缺少连续连接,难以仅凭邻域关系确定相对周期编号。
所以“展开后看起来连续”不保证已经确定了绝对投影位置。尤其是多个不连通区域,仍可能各自差一个未知整数周期。
时间展开:用额外图案给周期编号
时间相位展开(temporal phase unwrapping)通过依次投出的额外编码,帮助每个像素确定级次。“时间”指采集顺序,并不是研究物体随时间怎样运动。
常见路线有:
| 方法 | 提供的信息 | 需要留意 |
|---|---|---|
| 多频层级法 | 稀疏条纹先给粗位置,逐级解开密集条纹 | 粗频率误差可能导致细频率级次误判 |
| 多波长外差法 | 接近频率的差形成较长等效周期 | 差相位噪声和频率选取影响可靠性 |
| 格雷码加相移 | 二进制图案给编号,相移给周期内位置 | 编码边界、过曝与阴影仍可能造成误码 |
| 数论式消歧义 | 利用多组周期之间的组合约束 | 需要匹配频率设计与抗噪条件 |
格雷码(Gray code)的相邻编码只改变一个比特,有助于降低某些边界判读风险,但不等于可以忽略误码。
以多频层级法为例,若低频相位 \(\Phi_l\) 已有可靠基准,且两个频率的相位原点与编码方向一致,频率比为 \(r=f_h/f_l\),可以估计:
\[ \begin{aligned} k_h&=\operatorname{round}\left(\frac{r\Phi_l-\phi_{w,h}}{2\pi}\right),\\ \Phi_h&=\phi_{w,h}+2\pi k_h. \end{aligned} \]这里 round 表示取最近整数。如果括号内误差大到跨过半整数边界,就可能把级次选错。展开失败造成的是整周期错误,不只是相位稍微抖动。
N 步相移解决“一个周期里的位置”,相位展开解决“第几个周期”。它们是前后相接的步骤。三步相移加三步相移的双频方案,也不能简称为“三步相移自动完成展开”。
相位如何变成三维坐标
在一种简化的编码约定下,投影宽度为 \(W_p\),范围内有 \(f\) 个条纹周期,相位基准为 \(\Phi_0\),投影坐标可表示为:
\[ u_p=\frac{W_p}{2\pi f}(\Phi-\Phi_0). \]它表达的是相位与投影位置之间的关系,不是任意设备通用的高度公式。真实系统还可能需要处理畸变、扫描几何和非线性映射。
相机的一个像素对应一条空间视线。投影器的编码位置则对应一条光线或一个光平面,取决于编码与系统结构。知道两者的几何关系后,就能通过三角测量(triangulation)恢复空间位置。
标定(calibration)负责估计这些关系,例如相机内参、镜头畸变、相机与投影器的相对位置。相位很平滑但标定不对,最终尺寸一样会偏。
传统算法怎样选,哪些误差最常见
少帧路线各自借用了什么信息
标准 N 步相移以外,还有很多方法。先看它们怎样获得背景与相位分量,比记住所有名字更有用。
| 路线 | 做法 | 代价或条件 |
|---|---|---|
| 标准 N 步相移 | 等间隔相移,加权提取正交分量 | 多帧期间需要稳定 |
| 双三步相移 | 按特定初相关系组合两组三步结果 | 可抑制特定非线性误差,但图案数增加 |
| Hariharan 五步 | 对称取样与专门设计的权重 | 对设计步长附近的误差较不敏感,不是任意五张图都有效 |
| 改进 2+1 | 两张正交相位条纹加一张均匀图 | 图少,但抗噪与运动条件仍要检查 |
| 梯形、三角形相移 | 非正弦图案,利用分区和强度比估计位置 | 对反射率、波形失真和拐角模糊有要求 |
| 傅里叶解相及变体 | 在频域分离相位相关成分 | 对频谱重叠、边缘和局部变化敏感 |
普通单帧傅里叶法只用一张图;有些变体额外使用反相条纹或均匀图,分别用于去背景或归一化。不能把所有傅里叶路线都叫“单张方法”。
傅里叶变换(Fourier transform,FT)把“各位置有多亮”转换为“包含哪些空间频率”。密条纹是高空间频率,疏条纹是低空间频率。这个频率与相机帧率、振镜摆动频率不同。
载频(carrier frequency)是人为加入的基础条纹频率。在合适条件下,背景与条纹的一侧频谱能分开,提取后逆变换即可求相位。但尖锐边缘会产生宽频谱,滤波窗口太窄会丢细节,太宽又可能带入干扰。
窗口傅里叶变换(WFT)先选局部区域再分析频率,在空间定位、频率分辨率和抗噪声之间取舍。后面还会讲“窗口平滑”:前者是计算窗口,后者是投影过程中的光学效应。
理想正弦会被什么破坏
| 问题 | 实际含义 | 为什么影响相位 |
|---|---|---|
| 随机噪声 | 同样条件下亮度仍有波动 | 加权和不再精确,结果抖动 |
| Gamma 非线性 | 输入灰度与输出亮度不成正比 | 正弦波形失真,产生谐波 |
| 谐波 | 基础频率整数倍的成分 | 干扰按理想正弦推导的解算 |
| 相移误差 | 实际偏移量偏离设定值 | 正交消项条件被破坏 |
| 过曝/饱和 | 波峰达到相机上限,被截平 | 信息被截断,不能只靠后处理恢复 |
| 运动 | 不同帧不再对应同一物点 | 一组观测不共享相同未知量 |
| 离焦 | 投影或成像不在清晰焦面附近 | 调制幅值降低、边缘变模糊 |
| 阴影/遮挡 | 条纹没照到,或相机看不到 | 缺少有效观测 |
若采用等步相移,亮度噪声较小、独立且同方差,一个常用近似是:
\[ \sigma_\phi\approx\sqrt{\frac2N}\frac{\sigma_I}{B}. \] \(\sigma_I\) 是亮度噪声标准差,\(\sigma_\phi\) 是相位误差标准差。幅值减半、噪声不变时,相位误差大约翻倍。这个近似解释了为什么我们一直关心 \(B\),但它不包含运动、饱和、级次错误等所有问题。CNN 怎样从单张条纹学习解相
单张图的信息不足,网络靠什么补上
单个像素的一个亮度值仍然不够。但整张图里还有条纹方向、间距、邻域变化和边界。网络从训练样本中学习这些统计规律,再据此估计难以直接观测的量。
这就是先验(prior):解算时利用的额外结构或经验。传统单帧方法依赖频谱分离等假设,学习型方法则依赖网络结构与训练数据。
如果新场景完全超出训练范围,先验也可能失效。低误差的训练结果不能自动保证陌生材质、陌生频率或另一套设备上的效果。
卷积核、特征图与激活函数
卷积神经网络(Convolutional Neural Network,CNN)的基本操作,是让一个小型权重矩阵在图像上滑动,对每个邻域做加权求和。
例如 3×3 卷积核(kernel)每次处理九个输入。一个核在各位置得到的输出叫特征图(feature map);使用多个核,会形成多个输出通道。
特征通道不等于 RGB 颜色通道,也不保证每个通道都有明确的人类语义。浅层特征可能对边缘、方向和局部纹理敏感,后续层继续组合它们。
卷积后通常加入激活函数。ReLU 的定义很简单:
\[ \operatorname{ReLU}(z)=\max(0,z). \]非线性让网络能够表达比单纯线性滤波更复杂的关系。训练的主要工作,就是调整大量卷积权重,使输出符合任务要求。
学习 A、M、D,比直接回归相位更容易处理周期边界
一种有明确物理结构的路线是:
1 | 单张条纹 I |
为什么绕到 \(M\)、\(D\)?看 179° 和 −179°:它们在圆周上只差 2°,普通数值相减却差 358°。直接用普通数值损失学习包裹相位,会遇到表示边界的问题。
改为学习:
\[ M=cB\sin\phi,\qquad D=cB\cos\phi \]跨越主值边界时,两者仍然连续。网络预测这两个分量,最后由 atan2 负责读出角度。
\(c\) 是尺度系数。未归一化的 N 步标签对应 \(c=N/2\),12 步时是 6。共同缩放 \(M\)、\(D\) 不会改变 atan2 的角度,但会影响幅值恢复: \[ B=\frac{\sqrt{M^2+D^2}}c. \]因而 \(M\)、\(D\) 不应被直接当成单位幅值的正弦、余弦。若幅值很小,两个分量也接近零,即使表示连续,角度仍然对误差敏感。
训练、标签、损失分别是什么
监督学习(supervised learning)需要输入及参考答案。可以对静态场景采集 12 步相移图,通过公式计算背景与 \(M\)、\(D\),再让网络从其中一张图预测这些量。
参考答案叫标签(label / target)。它通常比单张估计更可靠,但仍可能包含系统误差,不是无条件的真值。
训练过程包括:
- 前向计算:输入条纹,得到预测。
- 计算损失:衡量预测与标签的差异。
- 反向传播:计算损失对各参数的导数。
- 优化器更新:根据导数调整参数。
连续量回归常用均方误差作为基本例子:
\[ L=\frac1P\sum_{p=1}^{P}(\hat y_p-y_p)^2. \]这里是损失概念的示例,不表示所有条纹网络都使用这一项,也不补写未经核实的训练设置。
级联方案可以先训练背景网络,再把它预测的背景用于训练第二个网络。这样第二级见到的不是永远完美的背景,而是更接近实际推理条件的输入。
几个训练名词也值得分开:batch 是一次处理的一组样本;iteration 通常指一次参数更新;epoch 是训练数据完整遍历一轮。训练集用于更新参数,验证集用于调参和选模型,测试集用于最终评估。把同一物体几乎相同的相移帧随机拆到三组中,可能高估泛化能力,按场景划分通常更能检验实际迁移。
“单帧”到底指哪一步
训练阶段可以用多帧生成标签,推理时的核心解相输入仍然可以只有一张。这并不矛盾。
更需要检查的是完整三维流程。如果包裹相位来自单张图,但绝对相位还使用其他频率或编码来展开,就不能说“整套三维测量只需要一张图”。
在一种已报道的级联实验中,主实验的相位 MAE 为 0.087 rad,对照 FT、WFT 分别约为 0.20、0.19 rad。这说明方法在该数据和配置下有效,不是跨系统保证。该实验的三维展示仍借助额外频率信息进行展开。对应资料见文末的“学习型条纹分析”。
U-Net:同时保留整体信息与局部位置
U-Net 最初用于生物医学图像分割。分割(segmentation)给每个像素分配类别,例如细胞或背景;回归(regression)预测连续数值,例如深度、背景亮度或 \(M\)、\(D\)。两者都可以逐像素输出,但任务目标不同。
图中只表达多尺度处理和同尺度特征拼接,省略层数、卷积参数与裁剪,不是原版网络尺寸图。
编码器与感受野
编码器(encoder)通过卷积和下采样逐步减小特征图的空间尺寸。例如 256×256 变成 128×128,同时通常增加通道数。
下采样(downsampling)减少位置采样,便于整合更大范围的信息,也会损失部分局部细节。感受野(receptive field)描述一个特征受到输入多大区域的影响;它不等于网络一定能正确利用整个区域。
解码器与跳跃连接
解码器(decoder)通过上采样等操作恢复较大的空间尺寸,生成密集输出。但单靠放大低分辨率特征,不能保证找回被丢掉的边缘位置。
U-Net 因此把编码器中较高分辨率的特征传给相应尺度的解码器,这就是跳跃连接(skip connection)。典型操作是沿通道拼接:64 通道与另一组 64 通道合在一起,得到 128 通道。
拼接(concatenation)与残差相加不同。残差块常写成 \(y=x+F(x)\),对应位置直接相加;拼接则保留两组通道,由后续卷积再融合。
这对条纹任务有用:整体区域帮助判断条纹走向,细节特征帮助保留物体边界。不过,多尺度融合并不专属于 U-Net。前述级联网络与原版 U-Net 不是同一拓扑,不能直接互换名称。
原版细节与可以借鉴的训练方法
经典 U-Net 使用无填充卷积,结构示例是 572×572 输入、388×388 输出,并通过裁剪匹配跳跃连接。常见的输入输出同尺寸版本,使用了不同的填充或其他结构调整。
它也重视少量标注的使用效率:
- 数据增强:平移、旋转、灰度变化和弹性形变,减少对固定样本的记忆。
- 边界加权:提高相邻细胞分隔区域的损失权重,降低黏连。
- 重叠分块:分块处理较大图像,同时给预测保留边界上下文。
分割输出常用 softmax 把类别分数变成概率,再用交叉熵惩罚对正确类别的不信任。回归 \(M\)、\(D\) 时通常不需要类别 softmax,因为两个输出可以为负,也不需要和为 1。
数据增强同样不能机械照搬。图像与标签的几何变换必须同步,还要符合投影物理。把条纹随意扭曲却保留原相位标签,只是在制造错误数据。
若要用 U-Net 做条纹回归,至少需要明确输入通道、输出尺度、损失函数、低幅值区域的有效掩膜,以及独立的展开方案。搭好一个 U 形网络,还不等于完成了单帧三维测量。
回到光源:MEMS 为什么会把条纹抹平
前面把注意力放在照片上,现在往前看一步。相机拍到的条纹质量,已经受到了投影器的限制。
扫描式投影怎样工作
MEMS 是微机电系统(Micro-Electro-Mechanical Systems)。这里指的是能快速摆动的微型反射镜。线激光经过反射镜扫描,同时改变输出亮度,在曝光时间内形成条纹图案。
FPGA(现场可编程门阵列)可以承担扫描位置、触发信号与激光功率的时序控制。它在这里是控制硬件,不是用来理解物体形状的神经网络。
DLP 常用微镜阵列控制二维图案,再经投影光学系统投出。严格说,DLP 的微镜阵列也属于 MEMS 技术;这里区分的是阵列式投影与扫描式投影,不能把二者说成完全无关的技术类别。
扫描式投影不一定需要传统投影端的聚焦镜头,减少了该处的离焦问题,但不意味着相机永远不失焦,也不意味着光束没有宽度。
激光线宽不是光谱线宽
这里的线宽,是线激光在扫描方向上的空间厚度。它是一条光带有多“粗”,不是激光包含多大范围的波长。
光带内部也不一定均匀:高斯型分布中间强、两侧弱;平顶分布在中间一段较平坦;实际光束还可能不对称。
扫描中心还没到某点时,光带前缘已经照到它;中心离开后,后缘仍然在照。这个点收到的光能来自一段邻近扫描位置,原本想投出的亮暗起伏因此被混合。
在局部近似下,可以把它理解成空间卷积:
\[ I_{\mathrm{actual}}\approx h*I_{\mathrm{ideal}}, \] \(h\) 是激光线的空间权重,星号表示卷积。这是物理积累过程,不是拍照后执行了模糊滤镜。用一个均匀线宽模型看衰减
设条纹周期宽度为 \(T_f\),激光线宽为 \(w\)。先假设光带内部均匀,并把其作用视为归一化矩形平均窗口。
把空间角频率记为 q,理想亮度记为 g(x),实际亮度简写为 Iₐ(x)。矩形窗口的计算可以分开看:
\[ \begin{aligned} q&=\frac{2\pi}{T_f},\\ g(x)&=A+B\cos(qx+\phi_0),\\ I_a(x)&=\frac1w\int_{-w/2}^{w/2}g(x-u)\,du. \end{aligned} \]积分以后,背景不变,正弦幅值从 B 变成 B′:
\[ \begin{aligned} I_a(x)&=A+B'\cos(qx+\phi_0),\\ B'&=B\operatorname{sinc}\left(\frac{\pi w}{T_f}\right). \end{aligned} \]这里采用 \(\operatorname{sinc}(z)=\sin z/z\),并令 \(\operatorname{sinc}(0)=1\)。有些库采用归一化定义 \(\sin(\pi z)/(\pi z)\),写代码前要看清楚。
正弦前面的系数发生了变化:
| 线宽与条纹周期之比 | 正弦系数约值 | 含义 |
|---|---|---|
| 0.1 | 0.984 | 衰减较小 |
| 0.5 | 0.637 | 明暗起伏明显降低 |
| 1.0 | 0 | 平均了完整周期,起伏抵消 |
这是归一化矩形窗口的计算示意,不是实测曲线,也不代表所有高斯或非对称光束。
上述例子只取 sinc 的首瓣。跨过零点以后,系数可能为负,对应幅值绝对值与 π 相位翻转;不能把全频段描述成一直单调衰减。
真实光强分布更复杂,可以将光带分成若干均匀小段,分别计算后累加。分段数增加能表达更多细节,但参数过多也会增加标定难度。在一种具体实现中,五段模型被用作精度与复杂度之间的折中。
调制衰减和额外相位偏移
引入环境光 \(\varepsilon\)、衰减因子 \(\lambda\) 和额外相位偏移 \(\delta_e\),模型可以概括为:
\[ I=A+B\cos(\phi-\delta_e),\qquad B=(A-\varepsilon)\lambda. \]在该模型对应的条件下,线宽主要衰减正弦起伏,而不改变平均背景。对称光强分布会消去相应的奇对称贡献;在讨论的有效工作区间内,额外相位偏移约为零。不对称光带可能同时影响幅值与相位。
即使没有额外偏移,\(B\) 下降也会降低抗噪能力。用算法把画面对比度拉大,并不能自动恢复物理投影中已经损失的信息;学习方法可能借助先验估计,但还要验证估计误差。
为什么最密的条纹不一定测得最准
先分清三个量:\(N\) 是相移图张数,\(f\) 是规定投影范围内的条纹周期数,空间频率则是单位距离内的周期数。固定范围后,\(f\) 增加意味着条纹更密。
如果范围宽度为 \(L\),则 \(T_f=L/f\)。在均匀线宽示例的首瓣内:
\[ \lambda(f)=\operatorname{sinc}\left(\frac{\pi wf}{L}\right). \]增加条纹数量有两种相反影响:同样的位置变化会产生更大的相位变化,但更密的起伏也更容易被线宽平滑。
比较不同频率,要先放到同一个尺度
高频原始相位与低频原始相位的数值尺度不同。设最高频的展开相位为 \(\Phi_f\),用 \(\Phi_f/f\) 表示共同尺度上的相位,则噪声标准差也要除以 \(f\)。
在相位展开正确、噪声与其他条件固定时,可得到下面的比例关系:
\[ \sigma_{\mathrm{normalized}} \propto\frac1{fB(f)} \propto\frac1{f\lambda(f)}. \]所以可以搜索:
\[ f_{\mathrm{opt}}=\underset{f}{\operatorname{arg\,max}}\ Q(f),\qquad Q(f)=f\lambda(f). \]arg max 的意思是“找到使后面这个量最大的自变量”。不是单独追求最大的 \(f\),也不是只追求最好的对比度。
在理想矩形窗口首瓣内,\(Q(f)\) 正比于 \(\sin(\pi wf/L)\),示例最优点为 \(f=L/(2w)\)。这是用来检查公式的简化结果;真实系统的光强分布、像素位置、工作距离和其他误差都可能改变最佳选择。
系统里怎样标定,而不是凭感觉挑频率
可在白板上投影不同条纹数量的相移图,逐像素求出 \(A\)、\(B\),再拟合 \(\lambda(f)\)。暗环境中 \(\varepsilon\approx0\),由前面的定义应有 \(\lambda=B/A\)。检查实现时,这个比例不能写反。
随后对各像素搜索 \(Q(f)\) 最大值,在不同工作距离重复,并按照系统的目标范围汇总选择。这里的“衰减模型标定”不同于几何标定:前者帮助选参数,后者把相位换成三维坐标。
一个扫描系统在约 220–280 mm 的测量空间内,汇总得到的最高条纹数量是 88;三个物体在这一选择下的重建重复测量差异 MAE 约为 0.023–0.025 mm。它说明针对具体硬件标定有效,不代表所有设备都应该设置为 88。详见文末“扫描投影的窗口平滑模型”。
改变激光功率也不是无代价的解决办法。幅值可能增加,平均亮度与部分噪声也会变化,还可能过曝。更细的光带或更合适的光强分布,优化的是另一组因素。
一个可以直接运行的四步相移实验
下面只用 Python 标准库。它验证解析公式与均匀线宽示例,不训练网络,也不生成真实三维测量数据。
保存为 phase_demo.py,运行 python phase_demo.py。代码使用与正文一致的减号相移约定,并显式拒绝零幅值相位。
1 | import math |
预期输出:
1 | frames: [134.641, 120.0, 65.359, 80.0] |
可以继续把相位改成 120°、−120°,检查 atan2 的象限判断;也可以将幅值改成零,观察为什么程序返回 None。若加入随机噪声,要多次重复统计,而不是只看某一次结果就断言哪个参数更好。
怎样判断“测得更好”
准确度(accuracy)关注接近真实值的程度,精密度(precision)关注重复结果的离散程度,重复性(repeatability)则是在相近条件下重复测量的一致性。
真实长度是 10 mm,仪器每次都测成 10.5 mm,重复性可能很好,却有明显偏差。前面的 0.023–0.025 mm 是重复测量差异,不能直接当成相对于真值的绝对准确度。
| 指标 | 回答什么 | 常见单位或范围 |
|---|---|---|
| MAE,平均绝对误差 | 平均偏离参考多少 | 随对象而定,如 rad、mm |
| RMSE,均方根误差 | 考虑平方后,整体误差多大 | 与被测量相同 |
| STD,标准差 | 结果或误差有多分散 | 与被统计量相同 |
| 模型拟合残差 | 模型与标定数据差多少 | 取决于拟合量 |
| IoU,交并比 | 分割区域与标注重合多少 | 0 到 1 |
分割的 IoU 是预测区域与参考区域交集面积除以并集面积。它与相位 MAE 不在同一尺度,不能比较哪个数值“更精确”。包裹相位误差还需要用圆周差或统一展开基准,否则 179° 与 −179° 会被错误算成相差 358°。
比较传统法与学习法时,还要对齐输入帧数、有效像素范围、展开方法和参考数据。网络额外用了几张辅助图、哪些低质量区域被剔除,都应该交代。
名词速查:容易混在一起的概念
光学与测量
| 名词 | 英文/符号 | 本文中的含义 |
|---|---|---|
| 结构光 | Structured Light | 主动投出已知编码,帮助建立几何对应 |
| 条纹投影轮廓术 | FPP | 利用条纹相位恢复表面形貌的一类方法 |
| 相移轮廓术 | PSP | 采用多幅相移条纹进行相位测量的路线 |
| 背景亮度 | Background,A | 不随相移变化的亮度基线,不是背景物体 |
| 调制幅值 | Modulation amplitude,B | 明暗起伏的幅度 |
| 对比度 | Contrast | 常用 B/A 表示的归一化明暗差,需核对定义 |
| 相位 | Phase,φ | 周期内的位置,用弧度表示 |
| 包裹相位 | Wrapped phase | 限制在一个主值周期内的相位 |
| 条纹级次 | Fringe order,k | 被补回的整数周期编号 |
| 相位展开 | Phase unwrapping | 估计级次并恢复跨周期相位 |
| 绝对相位 | Absolute phase | 在明确基准下消除了周期歧义的相位 |
| 空间频率 | Spatial frequency | 单位空间长度内的周期数 |
| 条纹数量 | Fringe number,f | 规定投影范围内的周期总数 |
| 相移步数 | Phase steps,N | 一组相移图像的张数 |
| 载频 | Carrier frequency | 人为加入的基础条纹频率 |
| 三角测量 | Triangulation | 通过已知几何关系求空间位置 |
| 标定 | Calibration | 估计设备几何或模型参数,要明确标定对象 |
| 有效掩膜 | Validity mask | 标记哪些像素有足够可靠的测量信息 |
网络与训练
| 名词 | 英文 | 本文中的含义 |
|---|---|---|
| 卷积核 | Kernel | 对局部邻域做加权求和的小矩阵 |
| 特征图 | Feature map | 卷积等操作产生的空间响应 |
| 通道 | Channel | 同一位置的不同特征分量,不限于颜色 |
| 激活函数 | Activation | 给网络引入非线性,如 ReLU |
| 感受野 | Receptive field | 一个特征能受到输入多大区域的影响 |
| 编码器/解码器 | Encoder / Decoder | 提取多尺度信息/恢复密集空间输出 |
| 下采样/上采样 | Downsampling / Upsampling | 减小/增加特征图空间尺寸 |
| 跳跃连接 | Skip connection | 把前面特征直接传给后面层 |
| 拼接 | Concatenation | 沿通道保留多组特征,不是逐元素相加 |
| 残差块 | Residual block | 常用输入加学习到的修正量构成输出 |
| 标签 | Label / Target | 监督训练中的参考输出,可能含测量误差 |
| 损失 | Loss | 衡量预测与训练目标之间的差异 |
| 反向传播 | Backpropagation | 计算损失对参数的导数 |
| 推理 | Inference | 用训练后的参数对新输入做预测 |
| 泛化 | Generalization | 对未参与训练的数据仍然有效 |
| 过拟合 | Overfitting | 训练集表现好,独立新数据表现较差 |
| 数据增强 | Data augmentation | 构造符合任务规律的输入与标签变化 |
| 回归/分割 | Regression / Segmentation | 连续量预测/像素类别预测 |
光源与误差
| 名词 | 英文/符号 | 本文中的含义 |
|---|---|---|
| 微机电系统 | MEMS | 此处指用于扫描的微型反射镜系统 |
| 现场可编程门阵列 | FPGA | 可配置的数字控制硬件 |
| 激光线宽 | Linewidth | 此处是光带空间厚度,不是光谱线宽 |
| 高斯光强分布 | Gaussian profile | 中间较强、两侧渐弱的空间分布 |
| 平顶分布 | Flat-top profile | 中部较平坦的光强分布 |
| 窗口平滑 | Window smoothing | 有限光带扫描造成邻近贡献混合 |
| 衰减因子 | Decay factor,λ | 模型中调制起伏保留程度的系数 |
| 相位偏移 | Phase offset,δe | 除目标相位外引入的额外偏移 |
| 信噪比 | SNR | 有效信号相对于噪声的强弱,需核对具体定义 |
| 离焦 | Defocus | 偏离清晰成像条件造成模糊 |
| 动态范围 | Dynamic range | 系统能有效区分的弱信号到强信号范围 |
| 饱和 | Saturation | 达到记录上限,亮度变化被截断 |
| 准确度/重复性 | Accuracy / Repeatability | 接近真值/重复测量的一致性 |
真正做实验时,先排查哪一步
面对一张不理想的三维结果,先看原始条纹是否过曝、暗部是否还有足够的 \(B\)。再检查多帧是否对齐、相移约定是否一致、包裹相位是否正常。若出现整周期的台阶,优先排查级次错误;若整体尺寸稳定地偏大或偏小,再检查几何标定与系统偏差。
学习型方案还需要额外检查训练域是否覆盖当前的材质、频率和硬件。扫描式投影则应把光带宽度与条纹密度一起标定,而不是直接复制其他装置的最优数值。
一个可行的学习起点,就是先运行上面的四步相移例子:确认自己能从四个亮度值恢复背景、幅值和相位,再给它增加噪声与周期编号。等这些量不再混淆,换成神经网络或真实投影器时,才知道每个模块究竟替代了什么、还留下了什么问题。
资料与复核入口
正文按概念重组,没有按论文逐篇介绍。下面保留来源入口,便于核对模型、结构和实验条件:
文中插图为教学示意,没有使用论文原图;代码是解析模型的小实验,不是神经网络训练或硬件测量复现。