把明暗条纹投到一个石膏头像上,相机能看到鼻梁、卷发和脸颊上的条纹发生变化。接下来怎么把这些亮度值变成三维坐标?

这件事最容易混淆的地方,是把“求出相位”“确定条纹编号”和“恢复三维位置”当成同一个步骤。再加上单帧解相、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
2
3
4
5
6
单张条纹 I
→ CNN1 预测背景 Â
→ 将 I 与 Â 沿通道方向拼接
→ CNN2 预测 M̂、D̂
→ atan2(M̂, D̂)
→ 包裹相位

为什么绕到 \(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)。它通常比单张估计更可靠,但仍可能包含系统误差,不是无条件的真值。

训练过程包括:

  1. 前向计算:输入条纹,得到预测。
  2. 计算损失:衡量预测与标签的差异。
  3. 反向传播:计算损失对各参数的导数。
  4. 优化器更新:根据导数调整参数。

连续量回归常用均方误差作为基本例子:

\[ 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\)。两者都可以逐像素输出,但任务目标不同。

U-Net的编码器、解码器和同尺度跳跃连接示意,标明缩小特征图与恢复空间尺寸的过程

图中只表达多尺度处理和同尺度特征拼接,省略层数、卷积参数与裁剪,不是原版网络尺寸图。

编码器与感受野

编码器(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 平均了完整周期,起伏抵消

均匀矩形窗口模型中,线宽与周期之比为0.1、0.5和1时,三组正弦曲线的背景相同、幅值依次降低

这是归一化矩形窗口的计算示意,不是实测曲线,也不代表所有高斯或非对称光束。

上述例子只取 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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
import math


def extract(intensities):
n = len(intensities)
if n < 3:
raise ValueError("At least three phase steps are required")
offsets = [2 * math.pi * i / n for i in range(n)]
m = sum(v * math.sin(d) for v, d in zip(intensities, offsets))
d = sum(v * math.cos(a) for v, a in zip(intensities, offsets))
background = sum(intensities) / n
amplitude = 2 * math.hypot(m, d) / n
if amplitude < 1e-10:
return background, amplitude, None
return background, amplitude, math.atan2(m, d)


def sinc(z):
return 1.0 if abs(z) < 1e-12 else math.sin(z) / z


if __name__ == "__main__":
phase = math.radians(30)
frames = [100 + 40 * math.cos(phase - i * math.pi / 2)
for i in range(4)]
a, b, recovered = extract(frames)
assert recovered is not None
assert abs(a - 100) < 1e-10
assert abs(b - 40) < 1e-10
assert abs(recovered - phase) < 1e-10
assert extract([100, 100, 100, 100])[2] is None

print("frames:", [round(x, 3) for x in frames])
print(f"A={a:.3f}, B={b:.3f}, phase={math.degrees(recovered):.3f} deg")
for ratio in (0.1, 0.5, 1.0):
print(f"w/T={ratio:.1f}, coefficient={sinc(math.pi * ratio):.3f}")

预期输出:

1
2
3
4
5
frames: [134.641, 120.0, 65.359, 80.0]
A=100.000, B=40.000, phase=30.000 deg
w/T=0.1, coefficient=0.984
w/T=0.5, coefficient=0.637
w/T=1.0, coefficient=0.000

可以继续把相位改成 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\)。再检查多帧是否对齐、相移约定是否一致、包裹相位是否正常。若出现整周期的台阶,优先排查级次错误;若整体尺寸稳定地偏大或偏小,再检查几何标定与系统偏差。

学习型方案还需要额外检查训练域是否覆盖当前的材质、频率和硬件。扫描式投影则应把光带宽度与条纹密度一起标定,而不是直接复制其他装置的最优数值。

一个可行的学习起点,就是先运行上面的四步相移例子:确认自己能从四个亮度值恢复背景、幅值和相位,再给它增加噪声与周期编号。等这些量不再混淆,换成神经网络或真实投影器时,才知道每个模块究竟替代了什么、还留下了什么问题。

资料与复核入口

正文按概念重组,没有按论文逐篇介绍。下面保留来源入口,便于核对模型、结构和实验条件:

文中插图为教学示意,没有使用论文原图;代码是解析模型的小实验,不是神经网络训练或硬件测量复现。