What is WB(white balance)?

人的视觉和神经系统在看到白色物体的时候,基本不受环境的变化而出现严重的错觉。比如阴天,晴天,室内,室外,日光灯,白炽灯等的环境下,人依然会将白纸视作白纸。

但是imagesensor这种电子器件没有心理和神经作用。受制于环境色温的影响。拍出的照片会出现偏色的情况。

色温的定义:一个黑体加热之后,随着温度的升高,黑体会先发出红色,然后越来越亮,变成黄光,在变成白光,直至蓝光,这个温度就是色温。

下面看几组照片:

   

7700k                   5100k                      3500k

对在其色温下出现白色偏色的图片的修正就是白平衡。比如:7700 ,3500 的图片通过对sensor四通道数字增益达到5100k时的状态就可以实现白平衡。

why go to WB?

为让拍出的图片不受环境色温的影响,接近人眼感受,拍出白色物体不至于受到色温影响偏色。

how to go to wb?

说白了就是调节R,G,B的比例。调节到正常51000K时r;g;b的1:1:1的状态。下面的对角矩阵就是增益。

那么这个对角增益矩阵如何确定呢?

1.可以在不同的色温光源下分别拍图,计算r/g,b/g,gr/gb的比值。以5100k(拍出的白纸视为白色)作为标准色温。

2.通过计算Gain_r/g, Gain_b/g,Gain_gr/gb就有了。假设出现如下关系:

3.增益关系有了之后,我们再引进一个色温对应增益关系,如果知道色温就可以对原始图片进行白平衡了。例如:

上面的就是白平衡的原理了。

那么何为自动白平衡呢?

当然就是色温估计后根据色温增益曲线直接对图片进行白平衡了。

那么色温估计如何做呢?目前的算法如灰度世界法,白点法等等一系列改进的方法。我看了这些算法,总感觉很牵强。有各种各样的问题。

1 目前主流的色温估计方法是使用统计加权白点估计法。

选取图片roi. 分成N*M块. 计算每一块的r,g,b平均值,然后计算r_avr/g_avr  , b_avr/g_avr。然后将可能是白点的块保留,统计到色温曲线的距离,看哪些块距离色温曲线近且这样的块多,则认为就是目前的色温。如下图。

  

2 最新的色温估计直接使用色温传感器,预测的色温精准。这样就大大避开了估计算法的各种问题。例如,华为p20,传感器代替算法来估计色温的方法必将走向普及。

附一段灰度世界的白平衡方法(这个方法不需要模组厂进行wb calibration,方法简单,速度快,常用在车载镜头):


#include <highgui/highgui.hpp>
#include <imgproc/imgproc.hpp>

using namespace cv;

int main()
{
	Mat imageSource = imread("sunny123456.jpg");
	imshow("原始图像", imageSource);
	vector<Mat> imageRGB;

	//RGB三通道分离
	split(imageSource, imageRGB);

	//求原始图像的RGB分量的均值
	double R, G, B;
	B = mean(imageRGB[0])[0];
	G = mean(imageRGB[1])[0];
	R = mean(imageRGB[2])[0];

	//需要调整的RGB分量的增益
	double KR, KG, KB;
	KB = (R + G + B) / (3 * B);
	KG = (R + G + B) / (3 * G);
	KR = (R + G + B) / (3 * R);

	//调整RGB三个通道各自的值
	imageRGB[0] = imageRGB[0] * KB;
	imageRGB[1] = imageRGB[1] * KG;
	imageRGB[2] = imageRGB[2] * KR;

	//RGB三通道图像合并
	merge(imageRGB, imageSource);
	imshow("白平衡调整后", imageSource);
	waitKey();
}

sensor 插值后的图和白平衡后的图比较。(我同事的肖像,男版lena)

ISP PIPLINE (六) AWB的更多相关文章

  1. ISP PIPLINE (六) 3A 综述

    前言: 上一篇文章: ISP PIPLINE (五) Denoise 下一篇文章: (1)3A定义包括什么 Iris:自动光圈,根据环境自动调节光圈. 既然讲到光圈,就先看一下光圈是什么,以及它如何影 ...

  2. ISP PIPLINE(零) 知识综述预热

    本文为camera isp pipline概述 ISP,即image signal processing.为图像成型做的处理工作.适应不同光学环境下图像的还原. pipline流程如下: 光通过LEN ...

  3. ISP PIPLINE (十四) AE(自动曝光)

    自动曝光可以可以通过调节 模拟增益,数字增益,曝光时间,光圈大小来调剂曝光. 曝光在ISP PIPLINE的位置. (先介绍一个额外的知识点: ) gamma compression(也就是de-ga ...

  4. ISP PIPLINE (七) gamma

    what is the gamma? CCD.CMOS成像方式是通过像点中的"硅"感受光线的强弱而获得画面.而硅感光是物理成像,它真实地反应光线强度的变化,来多少就输出多少,因此它 ...

  5. ISP PIPLINE (一) BLC 以及 线性化

    what is the BlackLevel? 暗电流来源1.raw8为例,单个pixel的有效值是0~255,但是实际AD芯片的精度可能无法将电压值很小的一部分转换出来,芯片厂会刻意添加一个固定的偏 ...

  6. ISP PIPLINE (十五) AF

    主流的AF: CDAF, PDAF, laser assist AF(这个只是辅助,在微距或者拍摄纹理不明显的场景下好用). AF的大致原理就是检测图像锐度或者等价于锐度的参数,推动马达实现合焦或者对 ...

  7. ISP PIPLINE (九_2) Denoise 之 time domain denoise

    时域噪声是空域噪声在时间上波动的一种描述. 1.多帧平均去噪法 1.1 理论: 1.2 帧数增加,噪声减小: 1.3 IIR滤波器的效果 2.1中的两种方法在拍摄视频的时候,如果有运动物体,则会出现拖 ...

  8. ISP PIPLINE (九_1) Denoise 之 space domain denoise

    1.空间域噪声类型 1.gauss+possion 2.椒盐噪声(dpc处理已经处理了) 去除空域噪声有哪些方法? 空域噪声一般的思想是对某pixel邻域的pixels进行加权平均. 比如 1.高斯降 ...

  9. ISP PIPLINE (十三) CSM/CSC(color space matrix/convert)

    1.RGB为何要转换为YCbCr,历史遗留问题! 一般一个技术如果为了保证原有的设备可以继续使用,就需要兼容以前的技术.黑白电视到彩色电视的进化就是转换为YCbCr的原因,同时YCbCr比RGB传输占 ...

随机推荐

  1. Python判断自定义的参数格式是否正确

    import argparse def args_validation(valid_list, valid_value): assert valid_value in valid_list, 'inv ...

  2. python httpserver

    python3: python -m http.server 80 python2: python -m SimpleHTTPServer 9004

  3. 关于ddl(新增字段)对数据库锁表|读写操作的影响_资料

    1.对一个表执行ddl(新增字段)会不会阻塞表,影响读写? 在一次项目升级之前需要执行一个新增字段的脚本(alter table...),表的数据量是260多万,执行时间是72秒,感觉略长,不知道会不 ...

  4. MySQL实战45讲学习笔记:事务隔离级别(第三讲)

    一.隔离性与隔离级别 1.事务的特性 原子性 一致性 隔离性 持久性 2.不同事务隔离级别的区别 读未提交:别人改数据的事务尚未提交,我在我的事务中也能读到.读已提交:别人改数据的事务已经提交,我在我 ...

  5. 2018-2019-2 实验一 Java开发环境的熟悉

    实验内容 1.使用JDK编译.运行简单的Java程序: 2.使用IDEA编辑.编译.运行.调试Java程序 实验知识点 1. JVM.JRE.JDK的安装位置与区别: 2. 命令行运行javac:ja ...

  6. C语言运算符优先级总结

    一 写在开头1.1 本文内容本文内容为C语言中运算符优先级的总结.转载于:https://blog.csdn.net/huangblog/article/details/8271791,感谢原作者的付 ...

  7. HTML(七)HTML 表单(form元素介绍,input元素的常用type类型,input元素的常用属性)

    前言 表单是网页与用户的交互工具,由一个<form>元素作为容器构成,封装其他任何数量的表单控件,还有其他任何<body>元素里可用的标签 表单能够包含<input> ...

  8. oracle建表 和 设置主键自增

    1.新建table CREATE TABLE ysb_log( id ) primary key not null , tbdate ) NULL, tb_time ) NOT NULL, tblog ...

  9. python的线程和进程

    1.线程的基本概念 概念 线程是进程中执行运算的最小单位,是进程中的一个实体,是被系统独立调度和分派的基本单位,线程自己不拥有系统资源,只拥有一点在运行中必不可少的资源,但它可与同属一个进程的其它线程 ...

  10. Django模型层-单表操作

    ORM介绍 MVC或者MVC框架中包括一个重要的部分,就是ORM,它实现了数据模型与数据库的解耦,即数据模型的设计不需要依赖于特定的数据库,通过简单的配置就可以轻松更换数据库,这极大的减轻了开发人员的 ...