4. 光场解码与重聚焦:数字重聚焦原理、傅里叶切片定理、重聚焦堆栈生成

好,我们进入第四章。前面几章我们把光场的基本概念、采集方式都聊透了。现在该动真格的了——怎么把原始的光场数据,变成我们能用的图像?

说白了,光场相机拍到的是一堆微透镜下的子图像。你直接看,根本没法用。我们需要一个“解码”过程,把四维光场L(u, v, x, y)提取出来,然后才能谈重聚焦。

4.1 从原始数据到光场:解码流程

我记得第一次拿到Lytro相机的RAW文件时,打开一看,密密麻麻全是小圆点。当时我就懵了。后来才明白,每个微透镜覆盖的像素区域,就是一个子孔径图像的采样点。

解码的核心步骤其实不复杂:

  1. 白图像校正:拍一张均匀白板,用来消除微透镜的渐晕效应
  2. 微透镜中心标定:每个微透镜在传感器上的投影中心,必须精确到亚像素级
  3. 四维光场重排:把每个微透镜下的像素,按(u, v)角度坐标和(x, y)空间坐标重新排列
  4. 去马赛克与插值:如果是彩色传感器,还需要做Bayer插值

我的经验:微透镜中心标定这一步,千万别偷懒。我曾经用了一个粗略的标定方法,结果重聚焦出来的图像边缘全是伪影。后来改用棋盘格标定板,精度提到0.1像素,问题才解决。

解码完成后,我们就得到了一个四维数组。你可以把它想象成一个(u, v)的网格,每个网格点对应一张完整的(x, y)图像。这个结构,就是后面所有操作的基础。

4.2 数字重聚焦原理

传统相机想改变对焦平面,得动镜头。光场相机不用——我们可以在计算机里“算”出不同焦平面的图像。这就是数字重聚焦。

原理其实很直观。你想想看,如果场景中某个点正好在焦平面上,它在所有子孔径图像里的位置是一样的。如果它不在焦平面上,它在不同子孔径图像里会有视差偏移。

数学上,重聚焦操作可以写成:

E(x', y') = ∫∫ L(u, v, x' + α·u, y' + α·v) du dv

这里α是重聚焦参数。α=0时,就是全聚焦图像。α>0时,焦平面向后移。α<0时,焦平面向前移。

关键理解:重聚焦的本质,就是对子孔径图像做“平移+叠加”。每个子孔径图像根据其角度坐标(u, v),乘以一个偏移量α·u和α·v,然后全部加起来取平均。

我在做第一个重聚焦demo时,直接用了暴力循环——遍历所有(u, v)像素,做平移再累加。结果一张1000万像素的光场,跑了十几秒。后来才意识到,这玩意儿可以用卷积加速。

4.3 傅里叶切片定理

说到加速,就不得不提傅里叶切片定理。这个定理是光场重聚焦的“核武器”。

它说的是什么呢?

在四维光场的傅里叶域里,沿着某个特定方向切一刀,再做逆傅里叶变换,就能得到对应焦平面的重聚焦图像。

数学表达:

Ê(ω_x, ω_y) = L̂(ω_x, ω_y, α·ω_x, α·ω_y)

其中L̂是四维光场的傅里叶变换,Ê是重聚焦图像的傅里叶变换。α还是那个重聚焦参数。

方法 计算复杂度 适用场景
空域平移叠加 O(N⁴) 小规模数据、教学演示
傅里叶切片 O(N² log N) 大规模数据、实时处理

注意:傅里叶切片定理要求光场数据是带限的,且采样满足奈奎斯特条件。如果微透镜阵列的采样率不够,切片出来的图像会有混叠伪影。我曾经在低分辨率光场上硬用这个方法,结果图像边缘全是锯齿——嗯,后来老老实实加了抗混叠滤波。

我个人习惯用傅里叶切片来做批量重聚焦,因为速度优势太明显了。但如果是单张重聚焦,空域方法反而更灵活——你可以随时调整α值,不用重新做FFT。

4.4 重聚焦堆栈生成

有了重聚焦方法,我们就可以生成重聚焦堆栈了。说白了,就是改变α值,生成一系列不同焦平面的图像。

堆栈的生成流程:

  1. 设定α的范围和步长。比如α从-5到5,步长0.5,共21层
  2. 对每个α值,计算对应的重聚焦图像
  3. 把所有图像按α值顺序堆叠起来

这个堆栈有什么用?用处大了去了:

  • 全聚焦图像:从堆栈里挑出每个像素最清晰的层,合成一张全清晰图像
  • 深度估计:每个像素的“最清晰层”对应的α值,就是它的深度
  • 景深编辑:可以任意改变照片的景深范围,甚至做“先拍照后对焦”

避坑指南:α的步长不是越小越好。步长太小,相邻层的图像差异微乎其微,反而增加了计算量。我一般根据场景的深度范围来定——如果场景深度变化大,步长可以大一些;如果深度变化平缓,步长要小一些。经验值:对于普通室内场景,步长0.3-0.5就够用了。

下面这张图,是我自己画的重聚焦堆栈生成流程,你可以对照着理解:

重聚焦堆栈生成流程 四维光场 L(u,v,x,y) 设定 α 范围与步长 循环 α = α₀ 到 αₙ 重聚焦计算 (空域/傅里叶切片) 存入堆栈 下一个 α 重聚焦堆栈 {I_α₀, I_α₁, ..., I_αₙ} 输入 解码后的四维光场 维度: (U,V,X,Y) 输出 多张不同焦平面图像 可用于深度估计/全聚焦

生成堆栈之后,我们就能做很多有趣的事情了。比如深度估计——每个像素在哪个α层最清晰,那个α值就对应了它的深度。这个思路,就是后面几章要讲的全聚焦和深度估计的基础。

总结一下:光场解码是把原始数据变成四维光场;数字重聚焦是通过平移叠加或傅里叶切片来改变焦平面;重聚焦堆栈就是一系列不同焦平面的图像集合。这三步,是光场成像最核心的操作流水线。

嗯,这一章的内容就到这里。代码实现的部分,我们会在后面的实战章节里手把手带着写。你现在要做的,是把这几个概念彻底吃透——特别是傅里叶切片定理,它不仅是加速工具,更是理解光场本质的钥匙。