3. 光场相机标定:微透镜中心检测、白图像生成、标定参数求解

光场相机标定,说白了就是给相机做「眼科检查」。你得知道每个微透镜到底对准了哪个像素,主透镜的畸变有多大,传感器和微透镜阵列之间有没有歪斜。我刚开始接触光场相机时,觉得这东西不就是个相机吗?直接拍不就行了?结果第一次重建出来的光场全是重影,像得了散光一样。嗯,从那以后我再也不敢跳过标定了。

这一章我们聚焦三个核心步骤:微透镜中心检测、白图像生成、标定参数求解。这三步走完,你的光场相机才算真正「校准」了。

3.1 微透镜中心检测

微透镜中心检测是标定的第一步。你想想看,每个微透镜在传感器上投影出一个圆形区域,这个区域的中心点就是我们需要找的。如果中心偏了半个像素,后续的深度估计就会产生系统性误差。

我个人习惯用「白图像法」来做中心检测。具体流程是这样的:

  1. 拍摄均匀白场:对着均匀光源拍一张白图像,让每个微透镜都饱和曝光。
  2. 提取亮斑:白图像上会出现规则的亮斑阵列,每个亮斑对应一个微透镜。
  3. 质心计算:对每个亮斑做亚像素级质心定位。

质心计算公式:

xc = Σ(i * I(i,j)) / ΣI(i,j)
yc = Σ(j * I(i,j)) / ΣI(i,j)

其中 I(i,j) 是像素 (i,j) 的灰度值,求和范围是亮斑的局部窗口。

我在项目中遇到过一个问题:如果白图像曝光不均匀,边缘的亮斑质心会偏。后来我改用「局部自适应阈值+高斯加权质心」,效果好了很多。

小技巧:质心计算窗口大小取微透镜直径的 1.5 倍左右。太小会截断亮斑,太大引入噪声。

3.2 白图像生成

白图像不只是用来找中心的。它还有一个更重要的作用——校正微透镜间的响应差异。说白了,每个微透镜的光学透过率、像素的灵敏度都不完全一样,白图像就是用来做归一化的。

生成白图像的步骤:

  • 拍摄一张均匀白场图像(用积分球或乳白玻璃)
  • 对每个微透镜区域,计算平均灰度值
  • 生成一张「归一化增益图」

实际使用时,把原始光场图像除以这张增益图,就能消除微透镜间的亮度差异。我记得第一次做这个校正时,光场图像上的「网格状」亮度不均一下就消失了,那种感觉真的很爽。

注意:白图像必须在相同的光圈和曝光时间下拍摄。如果光圈变了,微透镜的渐晕效应会不同,白图像就得重新拍。

3.3 标定参数求解

这一步是把前面检测到的中心点和白图像信息,转化为可用的数学模型。我们需要求解的参数包括:

参数 含义 典型值范围
微透镜间距 相邻微透镜中心的像素距离 10-20 像素
旋转角 微透镜阵列与传感器行方向的夹角 0-2 度
主透镜畸变 径向和切向畸变系数 k1, k2, p1, p2
微透镜偏移 每个微透镜相对于理想网格的偏移量 亚像素级

求解方法我推荐两步走:

  1. 全局粗标定:用所有中心点拟合一个仿射变换,得到间距、旋转角、整体偏移。
  2. 局部精标定:对每个微透镜,计算残差并做局部校正。

我曾经踩过一个坑:直接用全局仿射变换去校正所有微透镜,结果边缘的微透镜误差很大。后来发现是因为主透镜的畸变导致边缘微透镜的投影发生了非线性偏移。解决办法是在全局标定后,加入一个基于畸变模型的局部校正。

标定流程总结:

1. 拍摄白图像
2. 检测微透镜中心(质心法)
3. 生成归一化增益图
4. 拟合全局仿射变换
5. 计算局部残差并校正
6. 输出标定参数文件

3.4 知识结构图

下面这张图把整个标定流程串起来了。你可以看到,从原始白图像到最终的标定参数,中间经历了三个主要阶段。

光场相机标定流程 光场相机标定流程 原始白图像 微透镜中心检测(质心法) 白图像生成(增益图) 全局仿射变换拟合 局部残差校正 主透镜畸变参数 标定参数文件 输出:.json / .yaml 格式

3.5 标定质量验证

标定做完了,怎么知道好不好?我一般用三个指标:

  • 重投影误差:把检测到的中心点用标定参数反算回去,看偏差有多大。小于 0.1 像素算合格。
  • 光场一致性:用标定参数解码光场后,看不同视角图像之间的亮度是否一致。
  • 深度估计稳定性:对同一场景拍多张图,看深度图是否稳定。

经验值:重投影误差在 0.05 像素以内,深度估计的精度基本就够用了。如果超过 0.2 像素,建议重新标定。

嗯,标定这部分内容就这些。说白了,光场相机的标定没有想象中那么玄乎,核心就是找到微透镜中心、生成白图像、求解参数。每一步都有成熟的算法,关键是要理解每个步骤为什么这么做,以及参数之间的耦合关系。我在实际项目中吃过不少亏,希望你能少走这些弯路。