ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

光场相机入门:从成像原理到三维测量实战

光场相机入门:从成像原理到三维测量实战 说到光场相机可能很多人第一反应是那个已经在消费市场凉掉的Lytro。确实Lytro的商业路线没走通但光场成像本身在工业检测、生物医学、三维测量这些领域一直活着而且这几年因为计算摄影和端侧深度信息获取的需求又被频繁提起。我这两年做过几个跟光场相关的小项目最直观的感受是光场相机和普通相机完全不是同一种东西。普通相机是按下快门就出图光场相机则是先拍下一堆光线信息后面慢慢算。这种先记录再计算的思路决定了它的学习曲线、应用边界和踩坑方式都跟传统成像不一样。这篇文章就是我自己入坑以来整理的一版光场相机知识笔记从成像原理、硬件方案、数据处理流程到设备选型和实际项目里的经验教训一次说清楚。想入门光场成像的同学或者正在纠结要不要选光场方案做三维测量的工程师可以拿这份内容当个参考底稿。1. 光场相机到底在记录什么从拍到到算出来1.1 传统相机丢掉的方向信息才是光场相机的核心先想一个问题普通照片到底是什么说白了就是镜头把三维场景投影到二维传感器上每个像素记录的是到达该位置的光线强度的积分。这个积分过程把光线的方向信息彻底丢掉了。也就是说传统相机只知道有光落在某个像素上不知道这束光是从哪个方向来的。这个方向信息到底有什么用我用一个生活化的例子解释。想象你站在一个路口拍街景普通相机拍到的是一张静态照片你没法知道路边的建筑离你多远也没法在拍完后再改变焦点。但如果有人同时记下了每个进入镜头的光线的方向和位置那情况就完全不同了。你可以通过光线的方向差异反推出物体的远近也可以模拟把焦点从近处移到远处甚至能够换个角度看场景。这就是光场相机的核心价值它同时记录光线的位置和方向把传统成像中被压缩掉的那部分信息还原出来。用专业术语说它记录的是四维光场而不是二维图像。这也是为什么光场相机被誉为计算摄影的完整信息采集器。1.2 用双平面模型理解四维光场要理解光场最常见的方法是双平面模型。想象空间中有一根光线它在穿过一个平面时有一个坐标(x, y)在穿过另一个平行平面时有一个坐标(u, v)。只要知道这两个坐标这根光线的方向就完全确定了。所以整个空间中的光线集合可以用一个四维函数 L(x, y, u, v) 来描述这就是光场。在传统相机里传感器平面负责记录(x, y)也就是光线到达的位置但(u, v)方向信息被镜头积分掉了。光场相机做的事情就是把(u, v)方向信息也一并采样下来。具体到微透镜阵列方案主透镜平面可以被近似当作(u, v)平面传感器平面当作(x, y)平面微透镜阵列则用于把不同方向的光线分散到传感器不同位置上。引入这个四维视角之后很多原本复杂的问题就变简单了。比如重聚焦本质上是在四维光场上做一次积分投影深度估计本质上是从光场的角度信息中反推场景深度。这也是为什么光场相机能实现先拍照后聚焦、能单次曝光输出深度图这些能力都不是玄学而是四维数据带来的天然红利。1.3 光场相机能做什么三种核心能力基于四维光场数据光场相机可以做到三件传统相机做不了的事。第一数字重聚焦。拍完照片后可以在电脑上任意调整焦点位置让原本虚化的前景变清晰或者反过来制造浅景深效果。这使得某些对焦点要求极高的场景比如微距拍摄、工业零件检查可以先拍下来再处理。第二单次曝光的深度估计。因为不同方向的光线携带了深度信息光场数据可以计算出场景中每个点的深度值输出深度图或点云而且只需要一次拍摄。这对动态场景的三维测量特别有用普通结构光或双目方案在动态场景下要么需要投影、要么需要多机同步光场方案天然没有这个问题。第三视角合成与三维重建。四维光场可以合成出虚拟相机在不同位置拍摄的图像也可以用于生成场景的立体视觉甚至三维模型。AR/VR内容、文物保护、数字孪生都是光场数据适合的应用方向。理解了光场相机能做什么再看它背后的三条技术路线就比较容易判断哪条路线适合解决自己的问题了。2. 三条主流技术路线微透镜、相机阵列和掩膜方案2.1 微透镜阵列消费级光场相机的主流选择微透镜阵列方案是目前最常见的光场相机实现方式Lytro、Raytrix以及国内的稻神光场相机走的都是这条路线。它的结构很简单在图像传感器前面加一片由数万到数十万个微小透镜组成的阵列每个微透镜负责把来自主透镜不同方向的光线分散到它对应的那几颗像素上。这些微透镜下方的像素块通常叫宏像素。一个宏像素内部的多个像素记录的是同一个场景点在不同方向上的成像也就是角度信息。宏像素在传感器上的排列则对应场景的空间位置。举个具体例子如果每个宏像素覆盖10x10100个像素那光场就有10x10个视角方向空间分辨率则等于传感器总像素除以100。微透镜阵列方案最大的优势是结构紧凑、单次曝光就能采集完整光场而且不需要外部触发同步。缺点是空间分辨率和角度分辨率互相制约也就是大家常说的鱼和熊掌不可兼得。消费级Lytro一代拍出来的照片只有几十万级别像素就是这个问题。更细一点说微透镜阵列方案内部还分两个流派。一个是全光相机1.0微透镜放在主透镜的焦平面上角度分辨率高但空间分辨率掉得厉害另一个是全光相机2.0微透镜离焦放置通过聚焦微透镜让空间分辨率得到一定改善Raytrix的工业产品用的就是这种思路。2.2 相机阵列用体积换画质与视角如果你对空间分辨率有执念那微透镜方案很可能满足不了你。这时候可以考虑相机阵列。相机阵列方案说白了就是用多个普通相机在空间上按一定规则排列同时拍摄同一个场景每个相机相当于从不同视角记录光线合在一起就构成了一个稀疏的大口径光场。这个方案的好处很明显每个相机都有自己的完整传感器空间分辨率不损失。多个相机拼起来能同时获得很高的空间分辨率和丰富角度信息而且每个视角都是完整的照片质量这对三维重建、沉浸式视频、虚拟现实内容生成非常友好。代价也很大。首先是体积和成本一套几十个相机的阵列光搭建、供电、数据同步就是个大工程。其次是标定复杂度每个相机的内外参数、畸变、曝光都要严格一致拍摄时还需要硬件同步触发否则运动场景会出现严重误差。斯坦福大学早期的多相机阵列就是这个路线的代表现在很多体积视频拍摄棚也用类似思路。所以相机阵列更适合有固定场地、预算充足的团队。如果是实验室里做算法验证或者工业现场单机采集微透镜方案通常更现实。2.3 掩膜方案与其它思路实验室里的玩法除了微透镜和相机阵列还有一些实验室阶段的光场采集方案最典型的是编码掩膜方案。它的思路是在主透镜和传感器之间放一块经过精心设计的掩膜板对入射光线进行编码调制传感器记录下编码后的图像然后通过算法求解原始四维光场。这种方案的优点是硬件改动小、成本低甚至用普通相机加一块掩膜就能做实验。缺点也很致命光效率低掩膜会挡住大部分光线算法求解不稳定对噪声极其敏感。目前基本只停留在学术研究层面工业产品很少采用。另外还有基于微扫描或多传感器拼接的方案本质上都是为了让四维光场的采样更高效但工程复杂度普遍较高。总的说来除非你是专门做计算成像研究的否则选型基本就在微透镜阵列和相机阵列之间选。2.4 三条路线的横向对比我把三条路线的主要差异整理成一张表方便大家对照选择。对比维度微透镜阵列相机阵列编码掩膜空间分辨率低受宏像素数量限制高等于相机总像素中依赖算法重建角度分辨率高数万到数十万视角中等于相机数量中硬件体积小约等于普通相机大需要支架和供电小可改装普通相机标定复杂度中等微透镜中心畸变高多相机内外参同步高掩膜精确对位动态场景适配好单次曝光差需严格同步差重建耗时典型产品/代表Lytro、Raytrix、国产稻神斯坦福相机阵列、体视频工场学术样机适合场景工业测量、显微成像、动态深度获取体视频、高质量三维重建科研验证、教学演示从我看到的情况来说工业界和医疗领域绝大多数量产项目用的是微透镜阵列因为它把体积小、单次拍摄、深度信息这几个关键需求同时满足了。如果你不是特别需要多视角完整图像只是想要深度图和重聚焦能力微透镜方案是最省心的起点。3. 光场数据从RAW到成果的全流程实操设备买回来不是插上电就能出深度图的。一套完整的光场数据处理流程至少要经过微透镜标定、RAW解码、重聚焦、深度估计这几步。每一步都有不少坑我按实操顺序拆开讲。3.1 第一步标定微透镜中心拍好一张白图微透镜阵列在传感器前的物理安装不可能做到理想对齐微透镜中心和传感器像素之间存在亚像素级别的偏移而且这种偏移在不同区域还不完全一致。如果不做标定后续解码出来的光场图像就会出现明显的网格状伪影重聚焦画质也会大幅下降。标定的思路说起来很简单用均匀面光源或对着白色墙面拍一张均匀白图让每个微透镜都形成一个小亮斑然后通过亮斑的质心坐标确定微透镜中心的网格位置。实际操作时我会先拍一张RAW格式的白图再对每个微透镜的亮斑区域做质心提取。用OpenCV实现微透镜中心提取的简化流程如下import cv2 import numpy as np img cv2.imread(white_raw.png, cv2.IMREAD_GRAYSCALE) # 先做背景扣除减少暗电流影响 bg cv2.GaussianBlur(img, (51, 51), 0) img_sub cv2.subtract(img, bg) # 找亮斑轮廓 _, thresh cv2.threshold(img_sub, 0.3 * img_sub.max(), 255, cv2.THRESH_BINARY) contours, _ cv2.findContours(thresh, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE) # 对每个轮廓计算质心 centers [] for c in contours: m cv2.moments(c) if m[m00] 0: cx m[m10] / m[m00] cy m[m01] / m[m00] centers.append((cx, cy))这里有几个细节值得注意。边缘区域的微透镜因为受到主透镜渐晕影响亮度会明显偏低直接用固定阈值可能漏检。我踩过这个坑之后改用局部自适应阈值或者基于模型预测的位置去辅助提取成功率会高很多。另外质心计算前最好对图像做去噪否则个别坏点会把质心拉偏。标定的最终产出是一个与微透镜数量对应的网格模板。这个网格模板不但用于把RAW数据映射到四维光场还会在预处理阶段用于补偿每个宏像素的亮度不均。这个细节很多人会漏掉但它是保证后续深度估计稳定的关键一步。3.2 第二步RAW数据解码与光场重排拿到标定网格后就可以做光场解码了。解码的本质是把RAW图像中每个宏像素内的像素值按照相对中心的位置重排成四维光场 L(x, y, u, v)。其中(x, y)是宏像素的空间位置(u, v)是宏像素内部的角度索引。如果微透镜阵列是规则网格重排就是一个简单的reshape和transpose操作。我习惯的中间表示是:# 假设 raw 已经是按宏像素排列的数据 # raw_microlens shape: (H_ml, W_ml, U, V) # H_ml, W_ml 是微透镜行列数U, V 是每个宏像素内角度维度 light_field raw_microlens.transpose(2, 3, 0, 1) # 得到 shape: (U, V, H_ml, W_ml)重排之后light_field[u, v] 其实就是一个子孔径图像也就是从某个固定视角看场景的图像。所有子孔径图像合起来就构成了一组可以输入到后续算法的多视角数据。解码这一步最容易出问题是去马赛克demosaic的时机。RAW数据本身是Bayer格式传感器上每颗像素只有一种颜色。如果先做去马赛克再重排颜色插值会将相邻像素的信息混合导致角度维度串扰。正确做法是先做光场重排再对每个子孔径图像单独做去马赛克或者至少把Bayer解码和微透镜解码放在同一个重采样流程里处理。这个顺序问题直接影响最终颜色精度和深度边缘质量很多人都没意识到。3.3 第三步数字重聚焦的参数设置光场解码完成后最直观的体验就是数字重聚焦。传统相机通过移动镜头或传感器来改变对焦平面光场相机不需要任何机械动作直接在四维光场上做积分投影即可。在双平面模型下假设光场 L(u, x)先只看一维y和v维度类似重聚焦到新的对焦平面时光线需要按照视差进行移位累加。简化的重聚焦公式可以写成I_α(x) ∫ L(u, x u(1 - 1/α)) du其中 α 是重聚焦参数α1 表示原始对焦状态α1 或 α1 分别对应焦点向前或向后移动。实际操作中我会对α取一系列值得到一组不同焦点的图像然后通过焦点响应曲线比如梯度能量或拉普拉斯方差找到每个区域最清晰的α这就是简单的全聚焦合成方法。用伪代码表示核心循环def refocus(light_field, alpha): # light_field shape: (U, V, X, Y) U, V, X, Y light_field.shape center_u, center_v (U - 1) / 2.0, (V - 1) / 2.0 shifted np.zeros_like(light_field, dtypenp.float32) for u in range(U): for v in range(V): du (u - center_u) * (1 - 1.0 / alpha) dv (v - center_v) * (1 - 1.0 / alpha) shifted[u, v] warp_shift(light_field[u, v], du, dv) return shifted.mean(axis(0, 1))这里用的 warp_shift 可以是OpenCV的仿射变换也可以是频域相位平移。如果对图像质量要求高建议用双三次插值如果只是快速预览双线性就够了。重聚焦耗时会随着角度分辨率增加而大幅上升所以如果角度维度是11x11实际要做121次图像位移再累加优化空间很大。重聚焦一个容易踩的坑是边缘黑边。因为不同视角图像在做位移累加后边缘会丢失部分信息直接平均会出现黑边。常规做法是做边缘裁剪或者对位移后图像做边界填充再在累加时做归一化权重补偿。我在处理Lytro数据时还会先对每个子孔径图像做圆形mask把外围模糊像素去掉重聚焦质量会有肉眼可见的提升。3.4 第四步深度图与三维信息提取光场最深度的价值在深度估计。因为每个子孔径图像可以看作一个微小基线下的视角光场深度估计本质上就是多视角立体匹配但它跟普通双目立体又不一样视角数量多、基线极小、统一度量所以对遮挡和重复纹理的鲁棒性也有自己的问题。最经典的做法是利用EPI极平面图像。固定 y 和 v把光场切出一个二维切片 L(u, x)这个切片里场景中同一点会形成一条直线直线的斜率与深度直接相关。对EPI做直线斜率检测就能恢复出场景的深度值。直线斜率怎么提工业界常用的是结构张量或局部斜率估计简单又够快。我用过基于泰勒展开的结构张量方法对每个像素计算梯度矩阵再用特征值判断是否有显著方向得到斜率的密集估计。这个方法对平滑区域的效果不错但边缘和遮挡区域会有明显的错误响应。实际项目里我会把光场深度估计拆成这样几条路径并行验证基于EPI斜率的方法速度快适合实时预览。基于多视角立体匹配的方法精度高适合离线三维测量。每个子孔径图像都当作一个虚拟相机再用置信度加权融合多个视角的匹配代价。基于深度学习的方法比如用EPI堆叠作为输入训练卷积网络在遮挡区域的优势很明显近年来来的效果也超过传统方法。不管用哪种方法有一点必须提醒光场的深度精度和角度分辨率强相关。角度分辨率只有3x3的光场深度估计效果会明显不如11x11的。但如果空间分辨率的损失超过了你的应用底线那就要在两者之间认真权衡。4. 关键参数、设备选型与一个真实的测量案例4.1 空间分辨率与角度分辨率的关键权衡到底该怎么选光场相机最核心的参数权衡就是空间分辨率与角度分辨率。假设传感器总像素是 N角度分辨率为 U x V那么空间分辨率大约等于 N / (U x V)。比如一片1200万像素的传感器如果用10x10的角度分辨率空间分辨率只有约12万像素相当于344x350出头这画质放手机上都嫌模糊。所以我一直建议选光场相机前先想清楚你更看重图像清晰还是深度可靠。如果是做工业三维尺寸测量深度精度是硬指标角度分辨率一定要优先保证如果是做文档数字化或物体外观采集空间分辨率更重要那光场方案可能不是最合适的选择或者需要用超分辨率算法补救。这里还要提一下聚焦式光场的设计思路。Raytrix使用的多焦点微透镜阵列其实就是通过让不同微透镜聚焦在不同深度来缓解空间分辨率和角度分辨率的矛盾。这种设计能在一个比较大的深度范围内保持空间分辨率但代价是深度估计算法复杂度更高。选型的时候不能光看像素必须把微透镜参数和应用场景一起看。我的经验是列出三个需求优先级场景是什么类型、需要多高的深度精度、输出是图像还是点云。优先级明确之后参数取舍基本就清晰了。4.2 市售光场设备怎么选从二手Lytro到工业级方案目前能买到或还能用得上的光场设备可以分成三档。第一档是消费级或已经停产的Lytro。Lytro一代和Illum虽然公司已经不做硬件了但网上二手价格很低早期买一台用来做算法学习、数据结构实验完全够用。Lytro的RAW格式有开源工具比如ImageVisor、jel.lyt可以解析数据量也不算大适合零基础入门。但它没有原生的工业接口画质和深度精度也一般不适合直接做生产测量。第二档是工业级微透镜光场相机代表是Raytrix系列和国内的稻神光场相机。这类设备通常具备较高分辨率的传感器、多焦点微透镜阵列以及官方SDK和标定工具可以直接输出深度图或点云。价格比普通工业相机贵不少但对比定制光场系统的开发成本反而是划算的。适合做产线检测、精密测量和生物医学研究。第三档是自组装方案。买一片微透镜阵列比如日本Ophotonics的MLAs配合普通工业相机和延长筒自己搭一套光场相机。这种方式成本可控适合实验室验证原理硬件结构、光路设计、标定算法都要自己处理周期比较长。说实话不到万不得已或者没有光学基础不建议走这条路。我个人的建议是学习算法买Lytro做项目先借用或租一台工业光场相机验证效果确认精度达标后再购买。如果预算真的很有限再考虑自组装。4.3 案例复现用光场相机测量小零件的高度差说一个我实际做过的实验帮大家把上面的流程串起来。项目背景是测一个小型注塑件表面的两个平面高度差量级大概在0.1毫米左右零件尺寸不到10毫米。传统方案是共聚焦显微镜精度没问题但速度太慢而且设备成本高放在流水线上不合适。我这边验证光场相机能否用单次拍摄完成测量。设备选的是工业级微透镜光场相机装在固定架上镜头正对工件背后用环形LED光源照明。工作流程如下先做微透镜中心标定拍白图生成标定网格。再放上零件拍一张光场RAW图。解码成四维光场提取子孔径图像序列。用多视角匹配做深度估计输出深度图。对深度图做中值滤波去掉孤立噪声点然后根据平面拟合取两个平面的高度差。第一次跑出来的结果误差超过了0.2毫米跟预期差很多。排查后发现主要有两个问题一是零件表面有反光导致部分视角的匹配代价异常二是工作距离设置不合理导致深度分辨率在这么大的深度范围内摊薄了。后来换了漫射光源对反光区域做了掩膜屏蔽又把镜头光圈缩小了一点重新标定后误差降到了0.05毫米以内。这个案例说明几个道理光场方案可以在动态或单次拍摄场景下替代部分共聚焦测量但前提是光学设计、照明和后处理算法都要在应用约束下做完整优化。那种买台光场相机插上就能测尺寸的想法基本站不住。5. 常见问题与排查技巧实录5.1 重聚焦后边缘发虚、暗角明显重聚焦结果边缘发虚和暗角大概率不是算法问题而是微透镜中心标定不准。中心偏差会在重聚焦位移累加时放大导致边缘区域的对齐误差增大。处理办法是先检查标定白图的质心提取是否稳定。可以打印几个局部区域的网格覆盖图看网格线是否平齐。如果边缘区域明显偏斜就需要手动修正或对边缘做插值预测。另外宏像素内部每个角度通道的响应并不一致这是微透镜渐晕造成的。我会先统计每个角度通道的均值生成一个归一化增益系数在解码时做通道级校正。5.2 深度图噪声大、存在点状空洞深度图上的点状噪声常见原因有三个传感器坏点引起的固定模式噪声、微透镜串扰导致的低置信度像素以及遮挡边界区域的多义匹配。我的排查顺序是先做坏点检测与替换用中值滤波把孤立坏点去掉再做视角置信度评估对每个像素统计多个视角匹配代价的方差方差过大的直接标记为低置信最后对深度图做双边滤波保留边缘同时平滑平面区域。如果噪声还是很多就回到标定和白图处理看看是不是光照不均匀或微透镜阵列上有灰尘。5.3 成像马赛克感严重空间分辨率低导致画面像马赛克这是微透镜阵列光场相机的先天问题不是设备故障。缓解办法主要有三类调整角度分辨率比如把11x11降为7x7空间分辨率能提高约2.4倍。使用超分辨率重建算法把多视角信息融入高分辨率输出。换用聚焦式光场相机Plenoptic 2.0它的空间分辨率本来就会好一些。另外如果安装或拆卸过镜头要重新标定。微透镜阵列和传感器之间的间距如果因为结构受力发生变化解码参数也会偏移整个成像质量都会受影响。5.4 一个完整的问题排查速查表我把自己遇到过的典型问题整理成表方便大家直接对照处理。现象可能原因排查与解决办法重聚焦边缘发虚暗角微透镜中心标定不准、渐晕未校正重新做白图标定做角度通道归一化校正深度图点状噪声坏点、串扰、遮挡边界坏点替换置信度评估双边滤波画面网格状伪影解码网格与微透镜实际中心不匹配检查标定网格微调中心偏移不同视角亮度不一致微透镜渐晕、光源不均匀逐视角增益校准采用漫射光源颜色偏色在重聚焦后加重去马赛克顺序错误先重排后去马赛克避免颜色通道串扰深度严重漂移工作距离设置不当、标定参数过期检查工作距离和物镜倍率重新标定多次测量结果跳动环境震动、光源波动固定相机支架用恒流驱动光源并热机稳定这张表是我在实际项目里踩出来的不是官方手册内容。强烈建议在自己设备上遇到问题时先按这张表的顺序排查一轮。关于光场相机我个人最大的体会是它不只是一个相机而是一套采集标定计算的体系。买设备只是第一步真正花时间的往往是标定质量、数据处理流程和场景适配。如果你准备入门先从二手Lytro玩起亲手走一遍标定、解码、重聚焦的流程比看十篇论文都管用。最后再分享一个小技巧无论用哪家光场设备一定要先拍标定白图而且每次更换镜头、光源或工作距离后都要重新拍。光场数据的质量一半靠硬件另一半靠这一张白图。真正用熟了以后你会发现光场相机带来的自由度是传统成像完全给不了的——先拍下来后面怎么算选择权在你手里。
返回列表