从色温窗口到增益系数:一种硬件友好的实时白平衡方案
1. 为什么我们需要硬件友好的白平衡方案每次用手机拍出来的照片颜色不对劲你是不是总觉得是手机摄像头不行其实很多时候问题出在白平衡上。白平衡就像是给照片戴了一副有色眼镜它的任务是消除光源色温对颜色的影响让白色物体在任何光线下都能呈现真实的白色。在嵌入式设备和移动端传统的白平衡算法面临两个致命伤一是遇到大面积纯色场景就失灵比如拍一整面绿墙时照片会严重偏色二是算法太复杂硬件根本跑不动。我见过不少项目为了追求算法精度最后不得不外挂DSP芯片成本直接翻倍。硬件友好的白平衡方案必须满足三个条件计算简单乘法加法为主、内存占用小不需要大缓存、实时性好一帧内完成。这就像要求厨师在快餐店里既要做出米其林水准又只能用微波炉加热——难度可想而知。2. 色温窗口给光线贴标签的智能分类法2.1 色温与颜色的秘密关系不同光源发出的光其实自带颜色指纹。早晨的阳光偏蓝约5500K白炽灯发黄约2800K这些差异用色温值就能量化。有趣的是我们通过大量实验发现特定色温下灰色物体的色度值cb, cr就像被磁铁吸引一样总会聚集在固定范围内。举个例子在4000K色温下灰色像素的cb值会稳定在-10到5之间cr值在-8到6之间。这就像给不同色温的光源划定了领地范围我们只需要统计图像中像素点的分布情况就能反推出当前光源的色温。2.2 构建色温窗口的实战技巧实际操作中我是这样建立色温窗口的用标准色卡在不同光源下拍摄1000张RAW格式照片提取画面中灰色块的cb/cr值绘制二维散点图用聚类算法找出各色温下的密集区域设置合理的边界阈值形成色温窗口这里有个坑要注意窗口范围不能设得太窄否则会漏判也不能太宽否则不同色温窗口会重叠。经过实测我建议窗口边界保留15%的冗余空间最合适。3. RAW域处理的四大优势很多工程师习惯在YUV域做白平衡但在硬件实现时我强烈建议直接在RAW域处理。最近做的一个安防摄像头项目就验证了这点避免颜色串扰拜耳阵列插值前处理能防止后续工序污染原始颜色信息节省内存带宽RAW数据通常只有10-12bit/像素比处理YUV数据省30%带宽保留更多信息未经过伽马校正的数据线性度更好简化计算流程省去了多次颜色空间转换的步骤实测下来在RAW域处理能使功耗降低22%这对电池供电的设备简直是救命稻草。具体实现时记得在ISP流水线中把白平衡模块放在去马赛克Demosaic之前。4. 从像素到增益的完整数据流4.1 像素筛选的三重过滤不是所有像素都配参与白平衡计算我们的筛选标准很严格亮度过滤排除过暗5%最大亮度和过亮95%最大亮度的像素饱和度过滤剔除高饱和度像素cb² cr² 阈值色温窗口匹配只保留落在预设色温窗口内的像素在FPGA实现时这三个判断可以并行进行。这里分享一个优化技巧亮度判断可以用像素RGB的和值代替省去乘法器资源。4.2 色温判定的民主投票机制处理完一帧图像后各个色温窗口就像参加选举的候选人每个有效像素为其所在色温窗口投票统计各窗口得票数像素计数得票最多的窗口对应的色温胜出这个机制妙在它能自动适应混合光源场景。比如在室内开窗的环境系统会智能选择介于日光和灯光之间的色温值。4.3 增益计算的黄金公式确定主色温后计算增益就简单了提取该色温窗口内所有像素的R、G、B分量分别计算三个通道的平均值R_avg, G_avg, B_avg以G通道为基准计算增益R_gain G_avg / R_avg B_gain G_avg / B_avg G_gain 1.0 // 基准通道通常不调整在硬件实现时可以用定点数运算替代浮点数。比如采用Q8.8格式16位既能保证精度又节省资源。5. 与传统算法的性能对决我们在IMX586传感器上做了组对比测试指标灰度世界算法色温窗口方案纯色场景准确率38%89%计算延迟2.1ms0.7ms逻辑单元占用12k LUTs5k LUTs功耗28mW11mW特别是在拍摄红色幕布时传统算法把整个画面调得发青而我们的方案依然能保持白色物体的真实色彩。这要归功于色温窗口的筛选机制它像安检员一样把有嫌疑的偏色像素都拦在了门外。6. 移植到不同硬件的适配技巧这套方案已经在三家厂商的芯片上成功落地分享几个适配经验资源受限的MCU可以预先计算好色温窗口的查找表运行时直接查表带硬件加速的SOC利用SIMD指令并行处理多个像素FPGA实现用流水线架构处理拜耳阵列每个时钟周期处理一个像素最近给某无人机项目移植时发现其ISP只能处理8bit数据。解决方法是在统计阶段先右移4位16bit转8bit最后计算增益时再左移补偿精度损失在可接受范围内。7. 调试过程中的血泪教训第一个版本投片后出现间歇性色偏排查三天才发现问题出在像素统计时的整数溢出。现在我们的寄存器位宽一定会预留20%余量。另一个坑是色温窗口的边界值没做防抖当场景色温恰好在两个窗口交界处时画面会频繁闪烁。后来增加了滞后阈值类似施密特触发器问题才解决。建议在实验室准备几种典型光源6500K日光灯、3000K白炽灯、2800K蜡烛光。测试时要特别关注人脸肤色和白色物体的表现人眼对这些颜色最敏感。
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2528338.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!