照相机中白平衡的算法模拟实现

照相机紧要技术点为3A算法。

而3A算法紧要指的是机关对焦(AF)、自动曝光(AE)及自动白平衡(AWB)。
活动白平衡:依照光源条件调整图片颜色的保真程度。

网上时不时有近似招聘如下的招贤纳士音信: 

 ———————————————- ———————————————-

Camera/ISP 算法工程师
壁画机3A算法软件工程师 

此处随机摘录部分实际要求。

供职要求:
1、本科以上学历,天文,物理,机电、工业自动化,电子相关专业,大学生学历优先考虑;
2、本科毕业3年以上,硕士毕业1年以上的连带行业相关工作经历要求;
3、明白领会C/C++或者FPGA 开发语言,数据结构,MATLAB,信号和系统;
4、领悟数字色度学,数字图像处理,数字映像处理的基本知识;
5、熟谙摄影机成像原理;
6、领悟3A(AF,AE,AWB)算法之一;
7、对于自动化控制,数字信号采样,滤波,负反馈,PID算法有实在经历;
8、明白从画面到SENSOR,电机,ISP,编码器,采集,呈现通道一些列变化。

供职要求:

  1. 了然camera的3A(AE,AWB,AF)算法原理和筹划思路,
    有3A算法的规划经验为佳
  2. 装有丰裕ISP(图象处理器) 开发经历,熟练MTK,QUALCOMM,
    OV等便携式终端上使用的ISP开发条件。有上述条件下开发经历为佳。
  3. 贯通数字图像处理原理和基础知识。
  4. 深谙C/C++语言,有开发经历为佳
  5. 有部手机/便携式相机3A算法实现/应用经验
  6. 精晓CMOS sensor的办事原理

 ———————————————- ———————————————-

而这类职位一般都是高薪待遇。 

然后问题来了,市面上3A算法相关材料都很是难得,就连相关书籍都很少提及算法细节,而他们大都都会要求精晓3A算法至少之一。

而至于白平衡算法,相比较不利的素材是那份:

依照灰度世界、完美反射、动态阈值等图像自动白平衡算法的规律、实现及职能

事先反复与博主laviewpbt钻探相关的知识,获益匪浅。

而据我所知,绝大多数的相机接纳的根基算法便是灰度世界算法,然后在这算法的根底上再改良。

C语言,贴一下《基于灰度世界、完美反射、动态阈值等图像自动白平衡算法的法则、实现及效果》灰度世界法的大致内容。

 ———————————————- ———————————————-

灰度世界算法(格雷(Gray) World)

  是以灰度世界假如为根基的,该要是认为对于一幅负有大量情调变化的图像,
R、 G、 B 五个轻重的平均值趋于同一个灰度K。一般有二种方法来规定该灰度。

(1)间接给定为固定值, 取其各通道最大值的一半,即取为127或128;

(2)令 K = (Raver+Gaver+Baver)/3,其中Raver,Gaver,Baver分别代表红、 绿、
蓝两个通道的平均值。

算法的第二步是各自统计各通道的增益:

Kr=K/Raver;

Kg=K/Gaver;

Kb=K/Baver;

算法第三步为依照Von Kries
对角模型,对于图像中的每个像素R、G、B,总计其结果值:

Rnew = R * Kr;

Gnew = G * Kg;

Bnew = B * Kb;

对于上式,总计中或者会设有溢出(>255,不会现出小于0的)现象,处理情势有两种。

a、 直接将像素设置为255,这或许会招致图像全体偏白。

b、
统计有所Rnew、Gnew、Bnew的最大值,然后利用该最大值将将总括后数据重复线性映射到[0,255]内。实践表明这种形式将会使图像全部偏暗,指出使用第一种方案。

 ———————————————- ———————————————-

算法的大体思路就是评估一张图纸RGB两个通道的中最能表明该通道富含消息的值,然后以该值为基准重新调整像素。

诸如此类就会存在评估不够规范的问题,导致各通道像素消息差别过大,形成噪点以及偏色等景观。

因为一旦运用取最大值的方案就会促成在一定情景强烈不平衡,例如该通道大多数的值落在细微值周围,而却存在一个遥远处的最大值,那么就会促成像素信息差别过大,就很糟糕了。

为此在其次种思路上开展更进一步改进相比较妥当,因为可用的信息相比较多,不容易出问题。

其次种思路,最简便易行的另一种立异就是利用灰度法。

均值法: K = (Raver+Gaver+Baver)/3 

大家了然常用的视频采访编码是YUV。

YUV相关见百度百科:YUV

其中的Y为:

Y =0.299*R + 0.587*G+0.114*B

故灰度法相应可对应为:

K=0.299*Raver + 0.587*Gaver+0.114*Baver

经过实测,这样的处理后效果还不错。

贴上相比较图:

C语言 1

原图

C语言 2

均值法

C语言 3

灰度法

单从眼睛上去分辨两张图纸,的确很难分出优劣。

不过自己也只是大概点一下以此思路而已,有所积累的人,看到这,应该可以分流出更多的想法。

接下去自己要说的是现实相机中的钨丝灯等手动白平衡是咋样兑现的。

一句话来说的说就是色温调节。

那么依据灰度世界那些白平衡算法可以怎么落实这种调节呢?!

此间贴出简单实现的C代码:

switch (preset)
    {
    case AUTO: 
        Raver = (SumR / numberOfPixels);
        Gaver = (SumG / numberOfPixels);
        Baver = (SumB / numberOfPixels);
        break;
    case CLOUDY: 
        Raver = (SumR *1.953125 / numberOfPixels);
        Gaver = (SumG*1.0390625 / numberOfPixels);
        Baver = (SumB / numberOfPixels);
        break;
    case DAYLIGHT: 
        Raver = (SumR *1.2734375 / numberOfPixels);
        Gaver = (SumG / numberOfPixels);
        Baver = (SumB*1.0625 / numberOfPixels);
        break;
    case INCANDESCENCE: 
        Raver = (SumR *1.2890625 / numberOfPixels);
        Gaver = (SumG / numberOfPixels);
        Baver = (SumB*1.0625 / numberOfPixels);
        break;
    case FLUORESCENT: 
        Raver = (SumR *1.1875 / numberOfPixels);
        Gaver = (SumG / numberOfPixels);
        Baver = (SumB*1.3125 / numberOfPixels);
        break; 
    case TUNGSTEN:
        Raver = (SumR / numberOfPixels);
        Gaver = (SumG*1.0078125 / numberOfPixels);
        Baver = (SumB*1.28125 / numberOfPixels);
        break;
    default:
        break;
    } 

  

enum WB_PRESET{
    //自动白平衡
    AUTO,
    //阴天 7500k
    CLOUDY,
    //日光 6500k 
    DAYLIGHT,
    //白热光 5000k 
    INCANDESCENCE,
    //日光灯 4400k
    FLUORESCENT,
    //钨丝灯 2800k 
    TUNGSTEN,
};

 

C语言 4

阴天

C语言 5

日光

C语言 6

白热光

C语言 7

日光灯

C语言 8

钨丝灯

这里只是起到一个演示功效,具体的参数,可按实际需求酌情进行改动。

本文只是抛砖引玉一下,若有任何有关题材要么需要也足以邮件联系我探究。

 邮箱地址是:

gaozhihan@vip.qq.com