当前位置: 首页 > news >正文

3A之自动白平衡(AWB)篇

在手机相机的专业模式中,可以看到有一个白平衡(WB)调节的选项

什么是AWB

人眼视觉系统具有颜色恒常性的特点,对物体的观察不受光源的影响。本质上是白色的物体,在不同色温,反射光线颜色不同的场景下,经过人眼的视觉系统矫正后还是白色;而对于Camera来说,不同色温,反射光线颜色不同,直接成像会有偏色现象发生。如下图所示,可以看到阴影区域的白色部分偏蓝:

为了在不同的色温环境下,消除光源对图像传感器成像的影响,模拟人眼视觉系统的颜色恒常性,保证在任何场景下看到的白色为正常的白色,ISP的流水线中添加了白平衡WB模块来处理色温引起的偏色问题

色温

色温是表示光线中包含颜色成分的一种计量单位,用“K”(开尔文)表示。

绝对黑体从绝对零度(-273℃)开始加温后,黑体的颜色会逐渐由黑变红,转黄,发白,最后发出蓝色光,当加热到一定温度,黑体发出的光所含的光谱成分,就成为这一温度下的色温。

如果某光源发出的光,与某一温度下黑体发出的光所包含的光谱成分相同,就称为某K色温。

如100W灯泡发出的光的颜色,与绝对黑体在2527℃时的颜色相同,那么这个灯泡发出的光的色温就是:(2527+273)K=2800K

Camera中设置AWB

Camera1中通过Paramters进行设置

// 1. get support awb mode
/**
 * @see #WHITE_BALANCE_AUTO
 * @see #WHITE_BALANCE_INCANDESCENT
 * @see #WHITE_BALANCE_FLUORESCENT
 * @see #WHITE_BALANCE_WARM_FLUORESCENT
 * @see #WHITE_BALANCE_DAYLIGHT
 * @see #WHITE_BALANCE_CLOUDY_DAYLIGHT
 * @see #WHITE_BALANCE_TWILIGHT
 * @see #WHITE_BALANCE_SHADE
 */
mParameters.getSupportedWhiteBalance();


// 2. set wb to auto
mParameters.setWhiteBalance(Parameters.WHITE_BALANCE_AUTO)

Camera2中通过CaptureRequest.Builder进行设置

// 1. get support awb mode
characteristics.get(CameraCharacteristics.CONTROL_AWB_AVAILABLE_MODES);


// 2. set wb to auto
builder.set(CaptureRequest.CONTROL_AWB_MODE, CaptureRequest.CONTROL_AWB_MODE_AUTO);

相机AWB流程

在Turning阶段准备矫正参数在不同色温下按照一定梯度拍几张白纸作为色温照,然后对色温照的R/G/B通道进行矫正,让偏色的白纸照变为白色,并记录各个通道的矫正参数(实际只需矫正R和B通道,得到Rgain,Bgain),最后利用插值得到的色温-RG-BG的曲线图,大致如下:

图片来自参考资料一

在成像阶段只要计算出当前帧图像的色温,然后利用色温曲线图获取Rgain,Bgain进行颜色矫正即可。如何准确计算色温就是一个好的基于色温估计的AWB算法的核心和竞争力的体现了。

常见的AWB图像处理算法

常见的AWB图像处理算法有基于灰度世界,完美反射,动态阈值等图像自动白平衡算法和基于色温估计的自动白平衡算法。

这里简单说说灰度世界AWB,该算法基于灰度世界假设:在一幅有着大量色彩变化的图像中,其R,G,B三个分量的平均值趋于同一个灰度K,算法流程分为三个步骤:

  1. 计算平均灰度K,两种方式:第一种直接设定固定值,取各个颜色通道的最大值的一半,即127或128;第二种是计算各个颜色通道的平均值Raver,Gaver,Baver,然后对三个均值再求平均;

  2. 计算R,G,B通道的增益;

  3. 根据增益重新计算颜色值,计算中可能存在溢出(大于255),两种处理方式:第一种直接clamp,溢出的设置为255,这种方式可能造成图像整体偏白;第二种是计算所有新颜色中R,G,B通道的最大值,然后重新做线性映射到[0, 255],这种方式可能导致图像整体偏暗,一般直接采用第一种方案

核心代码如下:

原图效果:

白平衡处理后(原图中的晚霞效果,独特的红色被修正为了普通晴天的样子,这种就算过度的修正了):

一个正常效果的例子:

灰度世界法AWB算法计算简单,在复杂的场景下能呈现较好的效果,在颜色和物体单一的情况下,通常都会白平衡失败,容易受到噪声,渐晕,有限动态范围的影响

参考文章

1. https://blog.csdn.net/wzwxiaozheng/article/details/38434391

2. https://blog.csdn.net/wzwxiaozheng/article/details/40586293

3. https://www.cnblogs.com/Imageshop/archive/2013/04/20/3032062.html

~~END~~

推荐阅读

1. 从Bitmap中获取YUV数据的两种方式

2. 数字图像处理领域中常见的几种色彩模式

觉得不错,点个在看呗~

相关文章:

  • Shader基础技巧整理
  • 一起用Gradle Transform API + ASM完成代码织入呀~
  • 用shader做一个柿子颜色的过场动画
  • 只需跟着Google学android:ViewModel篇
  • 我用 OpenGL 实现了那些年流行的相机滤镜
  • 有必要去研究Handler和Binder么?
  • 音视频交流群又来啦~~~
  • Android 手机如何拍摄RAW图
  • 华为手机刷微博体验更好?技术角度的分析和思考
  • 播放视频时如何调整音频的音量
  • 视频码控:CBR、VBR和ABR
  • OpenGL ES 相机 LUT 滤镜
  • Android 11 正式发布 | 开发者们的舞台已就绪
  • 刚刚,鸿蒙 OS 2.0 发布!HarmonyOS 将正式开源!
  • 如何给 FFmpeg 添加自定义 Codec 编码器
  • [译]Python中的类属性与实例属性的区别
  • 【挥舞JS】JS实现继承,封装一个extends方法
  • axios请求、和返回数据拦截,统一请求报错提示_012
  • Docker: 容器互访的三种方式
  • JavaSE小实践1:Java爬取斗图网站的所有表情包
  • Java面向对象及其三大特征
  • Next.js之基础概念(二)
  • SpiderData 2019年2月25日 DApp数据排行榜
  • Spring Cloud中负载均衡器概览
  • Vim Clutch | 面向脚踏板编程……
  • Vue 动态创建 component
  • vue.js框架原理浅析
  • vue从入门到进阶:计算属性computed与侦听器watch(三)
  • Vue组件定义
  • 阿里云爬虫风险管理产品商业化,为云端流量保驾护航
  • 从0到1:PostCSS 插件开发最佳实践
  • 关于 Cirru Editor 存储格式
  • 湖南卫视:中国白领因网络偷菜成当代最寂寞的人?
  • 深入 Nginx 之配置篇
  • 深入浅出webpack学习(1)--核心概念
  • 使用SAX解析XML
  • 算法系列——算法入门之递归分而治之思想的实现
  • 小李飞刀:SQL题目刷起来!
  • 以太坊客户端Geth命令参数详解
  • #我与Java虚拟机的故事#连载13:有这本书就够了
  • (13)Hive调优——动态分区导致的小文件问题
  • (13)Latex:基于ΤΕΧ的自动排版系统——写论文必备
  • (2021|NIPS,扩散,无条件分数估计,条件分数估计)无分类器引导扩散
  • (4) openssl rsa/pkey(查看私钥、从私钥中提取公钥、查看公钥)
  • (保姆级教程)Mysql中索引、触发器、存储过程、存储函数的概念、作用,以及如何使用索引、存储过程,代码操作演示
  • (二)换源+apt-get基础配置+搜狗拼音
  • (七)MySQL是如何将LRU链表的使用性能优化到极致的?
  • (深度全面解析)ChatGPT的重大更新给创业者带来了哪些红利机会
  • (十)【Jmeter】线程(Threads(Users))之jp@gc - Stepping Thread Group (deprecated)
  • (译)计算距离、方位和更多经纬度之间的点
  • (转)德国人的记事本
  • (转)原始图像数据和PDF中的图像数据
  • (轉貼)《OOD启思录》:61条面向对象设计的经验原则 (OO)
  • * CIL library *(* CIL module *) : error LNK2005: _DllMain@12 already defined in mfcs120u.lib(dllmodu
  • .net framework4与其client profile版本的区别