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

2023-11-13

在手机相机的专业模式中,可以看到有一个白平衡(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. 数字图像处理领域中常见的几种色彩模式

觉得不错,点个在看呗~

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

3A之自动白平衡(AWB)篇 的相关文章

随机推荐

  • 计算机网络基础概论

    什么是Internet 从具体构成角度看 端系统 主机节点 主机及其上运行的网络应用程序 和网络交换设备 数据交换节点 中继器 路由器 交换机 负载均衡设备等 边 通信链路 分为接入网链路和骨干链路 接入网链路是指主机连接到互联网的链路 骨
  • java开发异常类型汇总

    1 java lang nullpointerexception 这个异常大家肯定都经常遇到 异常的解释是 程序遇上了空指针 简单地说就是调用了未经初始化的对象或者是不存在的对象 这个错误经常出现在创建图片 调用数组这些操作中 比如图片未经
  • Java 5-1、用户模块-Mybatis代码生成

    5 1 用户模块 Mybatis代码生成 从这里开始 环境相关配置就告一段落了 项目就开始进入开发学习阶段 一 代码生成 实体类 Mapper接口 Mapper xml 分别生成 AppUser java SysUser java 再抽取B
  • Python题目:学生信息管理系统-高级版(图形界面+MySQL数据库)

    Python题目 学生信息管理系统 高级版 图形界面 MySQL数据库 使用图形界面显示 选用list tuple dictionary或map等数据结构 操作数据库存储X个学生的三门课的成绩 机器学习 Python程序设计 研究生英语 并
  • #BDA#笔记#阶段一:熟悉要分析的数据

    学习参考 1 小灶能力派 BDA证书班
  • java jhat_java命令--jhat命令使用

    jhat也是jdk内置的工具之一 主要是用来分析java堆的命令 可以将堆中的对象以html的形式显示出来 包括对象的数量 大小等等 并支持对象查询语言 使用jmap等方法生成java的堆文件后 使用其进行分析 第一步 导出堆 jmap d
  • 将一组很大的数据集随机分成两组数据

    最近在看机器学习的东西时发现了一些特别好玩的东西 机器学习中又分为训练集和测试集 如何把一组很大的数据分为这两个集合呢 可以使用接下来的函数完成 当然由于random这个随机数生成函数每次产生的数不一定都是刚好达到你的期望 所以总会有一点小
  • 【大数据入门核心技术-Impala】(一)Impala简介

    目录 一 Impala介绍 二 Impala优势 三 Impala主要功能 一 Impala介绍 Impala是Cloudera公司主导开发的新型查询系统 它提供SQL语义 能查询存储在Hadoop的HDFS和HBase中的PB级大数据 已
  • hibernateCRUD

    本文章的目的是实现hibernateDao层功能 但是具体的操作不在Dao层内完成 实体类 package com hibernate entity public class User private int id private Stri
  • 前端实现单元测试(代码版)

    Jest使用 下载 npm install save dev jest ts jest ts node jest globals types jest 在nodejs中支持ts ts执行报错 npx ts jest config init
  • 小白学习go之基础篇2 -- Slice切片的原理

    文章目录 前言 一 为什么要有切片 二 切片是怎么实现的呢 1 Go的切片结构体 SliceHeader 2 初始化切片的两种方式 3 切片是在栈上分配内存的还是在堆 4 切片的扩容 三 切片的使用有什么坑需要注意呢 总结 前言 本文主要记
  • 【解决】mysql安装时,Unable to connect to any of the specified MySQL hosts

    解决方法 win r打开运行 输入regedit 打开注册表 更改注册表 找到HKEY LOCAL MACHINE SYSTEM CurrentControlSet services mysql 服务名 ImagePath 我原先的地址为
  • 性能调优篇07:Zabbix性能优化的几点原则

    性能调优 概述 使Zabbix系统正确调整以获得最佳性能是非常重要的 Zabbix性能优化的几点原则 确保zabbix内部组件性能处于被监控状态 调优的基础 使用硬件性能足够好的服务器 不同角色分开 使用各自独立的服务器 使用分布式部署 调
  • 统计:Flutter,开发采用量

    本文作者 徐宜生 原文发布于 群英传 Flutter这个东西出来这么久了 到底市场占有率怎么样呢 为了让大家了解这一真实数据 也为了让大家了解当前Flutter在各大App中的使用情况 我今天下载了几百个App 占了手机将近80G空间 就为
  • 队列同步器AQS原理分析及具体实现

    Java中的并发编程很多都是以队列同步器AbstractQueuedSynchronizer为基础的 例如ReentrantLock CountDownLatch等 下面介绍其构成以及相应的实现 构成 private volatile in
  • 【汽车电子】浅谈LIN总线

    目录 1 为何使用LIN总线 2 什么是LIN总线 3 LIN总线的主从关系 4 LIN的特点 5 LIN报文帧结构 6 LIN总线波形 7 帧类型 8 进度表 9 状态机的实现 10 总结 11 声明 1 为何使用LIN总线 在这里你可能
  • Vue常用的修饰符有哪些?分别有什么应用场景?

    一 修饰符是什么 在程序世界里 修饰符是用于限定类型以及类型成员的声明的一种符号 在Vue中 修饰符处理了许多DOM事件的细节 让我们不再需要花大量的时间去处理这些烦恼的事情 而能有更多的精力专注于程序的逻辑处理 vue中修饰符分为以下五种
  • 一步一步详解LSTM网络【从RNN到LSTM到GRU等,直至attention】

    一步一步详解LSTM网络 从RNN到LSTM到GRU等 直至attention 0 前言 1 Recurrent Neural Networks循环神经网络 2 The Problem of Long Term Dependencies长期
  • import sys

    import sys 的作用是什么 参考来源 1 首先 先看一段代码 1 from sys import argv 2 script first second third argv 3 print The script is called
  • 3A之自动白平衡(AWB)篇

    在手机相机的专业模式中 可以看到有一个白平衡 WB 调节的选项 什么是AWB 人眼视觉系统具有颜色恒常性的特点 对物体的观察不受光源的影响 本质上是白色的物体 在不同色温 反射光线颜色不同的场景下 经过人眼的视觉系统矫正后还是白色 而对于C