AWB-Tuning(1)

news2024/11/27 19:47:52

一、白平衡的概念

AWB – Auto White Balance
白平衡就是:不管在任何光源下,都能将拍摄的白色物体的图像还原为白色

人眼在早晨、中午、晚上 不同色温下都能准确看到白色。 CMOS 要获得这种能力,必须对每种光源做相应的色彩校准,才能完成人眼一样的功能。这个功能叫做白平衡。

在这里插入图片描述

二、白平衡的原理

若何让camera sensor拍摄的图片和人眼看到的一致呢?
我们把sensor的R、G、B 分量各自乘上一个系数,使RGB 三个能量保持相同即可。

白平衡的算法就是计算R、G、B的gain 值。一般在实验室中用18%灰卡或者取第22 个灰色色块,用软件计算出R、G、B 的均值,由于G 最大,所以以G 作为目标进行补偿。
比如: 原始R =15,G=40,B=30,采用如下的方法计算白平衡的gain 值。
R_gain = 40/15
B_gain = 40/30
G_gain = 1
在这里插入图片描述
可以查看eeprom

Light Type: D65 
  rOverG   = 0.465298
  bOverG   = 0.716520
  grOverGB = 0.994135

三、白平衡的算法:

1.灰度世界法(Grey World Algorithm):

这是一种基于统计的方法,假设整个图像的平均颜色是灰色。用于校正图像中的颜色偏差,使白色区域呈现中性色调。该算法基于一个假设:在自然场景中,各种颜色的像素的平均值应该接近于灰色。

1.灰度世界算法(Gray World)是以灰度世界假设为基础的,该假设认为对于一幅有着大量色彩变化的图像, R、 G、 B 三个分量的平均值趋于同一个灰度K。一般有两种方法来确定该灰度。
(1)直接给定为固定值, 取其各通道最大值的一半,即取为127或128;
(2)令 K = (Raver+Gaver+Baver)/3,其中Raver,Gaver,Baver分别表示红、 绿、 蓝三个通道的平均值。
2.算法的第二步是分别计算各通道的增益:
Kr=K/Raver;
Kg=K/Gaver;
Kb=K/Baver;
3.算法第三步为根据Von Kries 对角模型,对于图像中的每个像素R、G、B,计算其结果值:
Rnew = R * Kr;
Gnew = G * Kg;
Bnew = B * Kb;
对于上式,计算中可能会存在溢出(>255,不会出现小于0的)现象,处理方式有两种。
a、 直接将像素设置为255,这可能会造成图像整体偏白。
b、 计算所有Rnew、Gnew、Bnew的最大值,然后利用该最大值将将计算后数据重新线性映射到[0,255]内。实践证明这种方式将会使图像整体偏暗,建议采用第一种方案。

需要注意的是,灰度世界法在某些情况下可能会产生不准确的结果,特别是在图像中存在大片单色区域或特殊光源下。在这些情况下,其他白平衡算法可能更为适用。然而,由于其简单性和有效性,灰度世界法仍然是许多图像处理应用中常用的一种自动白平衡方法。

2.白点算法(White Point Algorithm):

根据图像中的最亮像素(白点)来调整颜色,使白色区域呈现中性色调。该算法基于一个假设:图像中的最亮像素应该是白色,其互补色应该被用来平衡图像中的颜色。
1.白点检测:首先,算法会识别图像中最亮的像素,通常是具有最高亮度值的像素。这被假设为图像中的白点。
2.白点的互补色:根据色轮上的互补颜色关系,找到白点的互补色。例如,如果白点是最亮的红色,那么它的互补色将是青色。
3.调整颜色通道:使用白点的互补色来调整图像中的各个颜色通道,以达到白平衡。具体来说,将图像中每个像素的颜色通道值减去相应通道的互补色值,从而降低颜色的色调偏移。
4.限制范围:为了避免颜色通道的值超出合理范围(通常为 0 到 255),可以对调整后的像素值进行截断。
5.重建图像:根据调整后的颜色通道值,重建图像,使其呈现更准确的白平衡效果。

3.色温比例法(Color Temperature Algorithm):

根据光源的色温,调整图像中的颜色。这种方法通常使用预设的颜色温度和校正矩阵来实现。
色温比例法(Color Temperature Algorithm)是一种用于图像白平衡校正的方法,它基于光源的色温来调整图像中的颜色,以使图像呈现中性白色。色温是以开尔文(Kelvin,K)为单位来衡量光源的颜色的相对热度或冷度。色温比例法通过调整图像中的红色、绿色和蓝色通道,以便校正图像的颜色偏移。

1.确定光源的色温:首先,需要确定拍摄时的光源的色温。不同光源,如日光、白炽灯、荧光灯等,具有不同的色温。色温一般以开尔文为单位,例如,蓝天的色温约为 5500K,白炽灯的色温约为 2700K。
2.色温校正矩阵:根据已知的色温,使用预先计算的色温校正矩阵来调整图像中的颜色通道。这个矩阵会根据不同的光源和色温来进行调整,以使图像中的白色区域呈现中性。
3.颜色通道调整:将图像中的红色、绿色和蓝色通道按照色温校正矩阵进行比例调整。具体来说,增加或减少各个通道的亮度,以使图像的颜色偏移得到校正。
4.限制范围:同样地,为了避免颜色通道的值超出合理范围,可以对调整后的像素值进行截断。
5.重建图像:根据调整后的颜色通道值,重建图像,使其呈现更准确的白平衡效果。

4.最大似然估计法(Maximum Likelihood Estimation):

使用统计学方法来估计正确的白平衡值,以最大程度地减少色温偏差。
1.建立数据模型:首先,需要建立图像中像素的颜色分布模型,通常使用概率分布函数来表示。对于白平衡,可以使用多元正态分布或其他适当的分布模型。

2.定义似然函数:根据建立的数据模型,定义一个表示观测数据在不同参数下出现的概率的似然函数。这个似然函数描述了给定参数下观测数据的可能性有多大。

3.最大化似然函数:通过调整参数的值,找到使似然函数达到最大的参数值。这意味着选择使观测数据在给定参数下出现的概率最大的参数值,从而最可能地解释数据。

4.参数估计:找到最大化似然函数的参数值,这些参数即为最大似然估计的结果。这些参数将用于调整图像中的颜色通道,以实现白平衡校正。

5.光源标定法(Light Source Calibration):

它通过测量图像中已知白色物体的颜色来确定光源的色温,并进行相应的校准。这种方法适用于具有已知白色参考的场景,例如摄影棚中的标准白色板。
1.获取白色参考:在拍摄场景中放置一个已知的白色参考物体,通常是一个标准的白色板或卡片。这个白色参考应该有已知的色温,例如5000K。

2.拍摄图像:使用相机拍摄包含白色参考物体的图像,确保光照条件与实际拍摄环境一致。

3.提取参考颜色:从拍摄的图像中提取白色参考物体的颜色值,通常是在图像中选择一个代表性的白色区域,然后获取该区域的颜色通道值。

4.计算光源参数:使用已知的白色参考色温和提取的参考颜色,计算光源的颜色校正参数,如增益或偏移。

5.图像校正:将计算得到的光源参数应用于整个图像,对颜色通道进行校正,以实现白平衡效果。

6.重建图像:根据校正后的颜色通道值,重建图像,使其呈现更准确的白平衡效果。

6.基于图像分割的方法:

它将图像分割为不同的区域,然后对每个区域进行单独的白平衡调整。这种方法旨在应对图像中存在多种光源或复杂光照条件的情况,以实现更准确的白平衡效果。

1.图像分割:首先,使用图像分割算法将图像分割为不同的区域,每个区域代表了不同的颜色或光照条件。图像分割可以基于颜色、纹理、边缘等特征进行,以将图像分成相对均匀的区域。

2.区域白平衡:对每个分割后的区域进行单独的白平衡调整。对于每个区域,可以使用先前提到的其他白平衡算法(如灰度世界法、白点算法、色温比例法等)来调整颜色通道,以使每个区域的颜色达到中性。

3.区域合并:在完成单独的区域白平衡调整后,将调整过的区域重新合并成整个图像。这可以通过简单地将每个区域的调整颜色通道值组合起来,或者应用某种过渡策略来平滑区域之间的过渡。

4.重建图像:根据合并后的颜色通道值,重建图像,使其呈现更准确的白平衡效果。

四、高通实现白平衡算法的基本思路

4.1 定参考点

首先在灯箱里面不同光源环境下拍摄18%灰卡的图片,七种光源。然后计算每张图片的颜色的比值R/G 和 B/G,然后把这些点放在坐标轴上,作为参考点。
AWB参考点: 指的是不同传感器在不同光源下测得的灰色R/G 和B/G 比率。
AWB参考点的作用:计算给定场景中不同Bayer 网格统计数据和估计光源相关色温(CCT)的锚点。

在这里插入图片描述
在这里插入图片描述

4.1.2 验证参考点

logWarningMask=0x4000002 
logInfoMask=0x4000002
logVerboseMask=0x4000002
enable3ADebugData=TRUE
enableTuningMetadata=TRUE
  1. 在100% 视野(FOV)灰卡情况下捕捉一个日志,并读取灰度世界值(RG 和 BG), 检验chromatix 工具生成的值是否与此一致.
此值作为参考
09-04 10:35:22.903   838  1139 V CamX    : [ VERB][STATS_AWB] camxcsaagwv1.cpp:415: Analyze Analyze: Simple Gray
World Target Point ( 0.574335, 0.659707 )
09-04 10:35:22.953   838  1141 V CamX    : [ VERB][STATS_AWB] camxcsaagwv1.cpp:415: Analyze Analyze: Simple Gray
World Target Point ( 0.575797, 0.661352 )
09-04 10:35:23.007   838  1141 V CamX    : [ VERB][STATS_AWB] camxcsaagwv1.cpp:415: Analyze Analyze: Simple Gray
World Target Point ( 0.577295, 0.661002 )
  1. 在不同光源下(D75,D65,D50,CW,TL84,A,H)下拍摄包含MCC图的正常场景图像
    检查第21 色块的R/G 和B/G 比率. R/G 和 B/G 应介于0.9 和 1.1 之间.

4.2 光源权重

在不同光源条件下,部分统计数据极有可能是灰色统计数据,而其他统计数据不太可能是灰色统计数据。例如在日光条件下,如果统计数据在日光参考点(D75、 D65 和 D50)附近,则很可能是真正的灰色统计数据。而如果统计数据在室内参考点(A 和 H)附近,则很可能是非灰色统计数据。
比较常见的如黄色皮肤容易被误判为低色温下的白点;淡蓝色的窗帘,容易被误判为高色温下的白点。而且当一张图中既有白色,也有黄色,也有蓝色的时候,是不是感觉情况就有点复杂了。这时我们需要一定的策略来正确的判断出到哪个才是真的白。
在这里插入图片描述
可以查看光源权重和距离权重
室外场景,在高CCT 区域的统计数据分配更高的权重.
室内场景,在高CCT 区域的统计数据分配更低的权重,低CCT区域分配更高的权重

4.3 距离权重

AWB 基于距离分配权重,并通过距离权重本身定义灰色区,从而建立了一种灵活的灰色区。

在这里插入图片描述
权重为零 (0) 的距离代表灰色区的边界。使用距离权重分配可以将灰色区向外延伸,形成具有极低距离权重 ( ≤0.01) 的缓冲区。当统计数据在逐帧模式下越过灰色区边界时,缓冲灰色区会使连续帧的 AWB 决策尽量保持一致。
在这里插入图片描述
缓冲区由距离权重统计数据过滤器定义

参考

80-nk8722-14
https://blog.csdn.net/weixin_42854120/article/details/119390029

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/976344.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

asm disk被加入到另外一个磁盘组故障恢复---惜分飞

有朋友在aix环境对其中一个rac的asm磁盘组进行扩容 之后另外一套rac的磁盘组直接dismount Wed Aug 23 12:44:02 2023 NOTE: SMON starting instance recovery for group DATA domain 2 (mounted) NOTE: F1X0 found on disk 0 au 2 fcn 0.128808679 NOTE: SMON skipping disk …

RocketMQ 快速搭建与控制台搭建

一、下载资料及环境准备 这里 下载路径 可以下载对应的版本,本文以 4.9.5 为例:下载这里的Binary 为Linux 安装文件,Source 也下载,方便后续使用。 将下载后的包进行解压: 由于RockerMQ 的建议运行环境较大&#xff…

解决pyside6-uic生成py代码中文为unicode(乱码)的问题

前言 本来想用Java做客户端,后来发现很多算法还是Python有现成的比较方便。 所以最终选择了pyside6。但是用Designer(QT设计师)设计完后,生成的代码中文部分显示为unicode,也可以理解为乱码。 就像这样:…

MybatisPlus 扩展功能 代码生成 逻辑删除 通用枚举 字段类型处理器 配置加密

MybatisPlus 核心功能 条件构造器 自定义SQL Service接口 静态工具_软工菜鸡的博客-CSDN博客 3.扩展功能 3.1.代码生成 在使用MybatisPlus以后,基础的Mapper、Service、PO代码相对固定,重复编写也比较麻烦。因此MybatisPlus官方提供了代码生成器根据数据…

pytorch-v2.0.1 cuda arm64 aarch64 torch 2.0.1+cu118 源码编译笔记【2】验证cuda安装 成功

接上篇 pytorch-v2.0.1 cuda arm64 aarch64 torch 2.0.1cu118 源码编译笔记_hkNaruto的博客-CSDN博客 由于采用/usr/local/bin/gcc编译,先设置LD_LIBRARY_PATH,再启动python3 export LD_LIBRARY_PATH/usr/local/lib64:/usr/local/lib:/usr/lib64:/usr/…

高德Android高性能高稳定性代码覆盖率技术实践

前言 代码覆盖率(Code coverage)是软件测试中的一种度量方式,用于反映代码被测试的比例和程度。 在软件迭代过程中,除了应该关注测试过程中的代码覆盖率,用户使用过程中的代码覆盖率也是一个非常有价值的指标,同样不可忽视。因为…

Spring 6.0和SpringBoot 3.0新特性

目录 主要更新内容是以下几个: AOT编译 Spring Native GraalVM SpringBoot3生成二进制可执行文件底层流程 主要更新内容是以下几个: A Java 17 baselineSupport for Jakarta EE 10 with an EE 9 baselineSupport for generating native images with…

录音转写和AI质检的区别和使用场景

区别: 录音转写是将语音或录音转化为文本形式的过程。它通常涉及使用自然语言处理技术和语音识别算法来将音频文件中的语音转换为可读的文本格式。 AI质检是一种利用人工智能技术对客户服务、销售和其他电话中心交互进行自动化评估的过程。通过分析和评估客户和代…

【C++】STL案例2-员工分组

#include <iostream> using namespace std;#include<vector> #include<map>#define CHEHUA 0 //策划部门 #define MEISHU 1 //美术部门 #define YANFA 2 //研发部门class Worker { public:string m_Name;int m_Salary; };void createWorker(vector<…

flask使用Flask-Mail实现邮件发送

Flask-Mail可以实现邮件的发送&#xff0c;并且可以和 Flask 集成&#xff0c;让我们更方便地实现此功能。 1、安装 使用pip安装&#xff1a; $ pip install Flask-Mail或下载源码安装&#xff1a; $ git clone https://github.com/mattupstate/flask-mail.git $ cd flask-…

Java线程与锁常考知识点

Java线程与锁常考知识点 基础篇1. 创建线程的几种方式2. 线程池创建的方式3. 线程池提交任务的流程4. 线程池有哪些状态 进阶篇1. 说说对线程安全的理解2. 对守护线程的理解3. ThreadLocal的底层原理4. 并发、并⾏、串⾏之间的区别5. Java死锁如何避免&#xff1f;6. 线程池的底…

滑动窗口实例8(最小覆盖子串)

题目&#xff1a; 给你一个字符串 s 、一个字符串 t 。返回 s 中涵盖 t 所有字符的最小子串。如果 s 中不存在涵盖 t 所有字符的子串&#xff0c;则返回空字符串 "" 。 注意&#xff1a; 对于 t 中重复字符&#xff0c;我们寻找的子字符串中该字符数量必须不少于 t…

C/C++中FILE指针的使用总结

在C中&#xff0c;FILE指针是一个用于文件操作的指针类型。它是C语言标准库中的一部分&#xff0c;也被C所继承。通过使用FILE指针&#xff0c;我们可以打开、读取、写入和关闭文件。 在C中&#xff0c;FILE指针通常与标准库中的文件操作函数一起使用&#xff0c;例如fopen(),…

通俗易懂玩QT:QStackedWidget 学习

QStackedWidget 学习 一、介绍 业务需求&#xff0c;用到了 QStackWidget 这个类&#xff0c;然后程序存在很严重的内存泄露问题&#xff0c;所以特意研究了一下 QStackWidget 类&#xff0c;QStackWidget 类的功能是窗体切换&#xff0c;它比 QTabWidget 使用起来更为灵活&a…

【高等数学基础知识篇】——不定积分

文章目录 一、不定积分的概念与基本性质1.1 原函数与不定积分的基本概念1.2 不定积分的基本性质 二、不定积分基本公式与积分法2.1 不定积分基本公式2.2 不定积分的积分法2.2.1 换元积分法2.2.2 分部积分法 三、两类重要函数的不定积分——有理函数与三角有理函数3.1 有理函数的…

架构设计基础设施保障IaaS计算

目录 1 IaaS概述2 服务部署演进历程3 云虚拟机4 云虚拟机如何选型5 云虚拟机的创建操作6 服务部署访问 1 IaaS概述 云计算并不是一种单一类型的产品&#xff0c;而是为满足企业各种IT需求而提供的多种服务。 通过云计算提供的一类这样的服务是基础设施即服务&#xff08;IaaS&a…

蓝桥杯备赛(Day5)——二叉树

二叉树存储 普通做法&#xff0c;二叉树一个节点包括结点的数值以及指向左右子节点的指针 在class Node中 def __init__(self,s,lNone,rNone):self.valNoneself.llself.rr 在竞赛中&#xff0c;我们往往使用静态数组实现二叉树&#xff0c;定义一个大小为N的静态结构体数组…

使用iCloud和Shortcuts实现跨设备同步与自动化数据采集

在如今的数字时代&#xff0c;跨设备同步和自动化数据采集对于提高工作效率和便利性至关重要。苹果的iCloud和Shortcuts App为我们提供了强大的工具&#xff0c;可以实现跨设备同步和自动化数据采集的功能。本文将详细介绍如何利用iCloud和Shortcuts App实现这些功能&#xff0…

英诺森供应链一体化平台解析

近日&#xff0c;2023年中国物流与采购联合会科学技术奖正式公布&#xff0c;该奖项经国家科技部批准&#xff0c;在国家科学技术奖励工作办公室登记备案&#xff0c;是我国物流行业最具影响力的奖项之一。 英诺森联合客户申报的科技项目“英诺森供应链智能数据平台”&#xf…

Golang编写客户端SDK,并开源发布包到GitHub,供其他项目import使用

目录 编写客户端SDK&#xff0c;并开源发布包到GitHub1. 创建 GitHub 仓库2. 构建项目&#xff0c;编写代码Go 代码示例&#xff1a;项目目录结构展示&#xff1a; 3. 提交代码到 GitHub仓库4. 发布版本5. 现在其他人可以引用使用你的模块包了 编写客户端SDK&#xff0c;并开源…