白平衡是电视视频领域一个特别重要的概念,color correction等操作都是那里成功的

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

Willis
Zen
上善若水

   
 白平衡是电视机摄录领域一个不行首要的概念,通过它可以缓解色彩还原和色泽处理的一密密麻麻题材。白平衡是随着电子映像再次出现色彩真实而发出的,在标准素描领域白平衡应用的较早,现在生活费电子产品(家用视频机、数码照相机)中也普遍地利用,不过技术的前行使得白平衡调整变得越来越简单容易,但许多使用者还不甚了然白平衡的做事原理,理解上存在诸多误区。它是落实录像机图像能规范反映被摄物的色彩境况,有手动白平衡和活动白平衡等方法,本文简要的牵线了三种电动白平衡算法。

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

2 人赞同

一、原始的灰度世界算法

  灰度世界算法(格雷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]内。实践声明这种方法将会使图像全体偏暗,提出利用第一种方案。

       
一般的话,灰度世界算法的效果仍旧相比较好的吧,并且该算法的实施进度特别之快,方今也设有了好多对该算法举办改正的效益,有时间我在打点一下。

   
  图片 1 
 图片 2

   
  图片 3 
 图片 4

   
  图片 5 
 图片 6

                     
               原图                                                    
                       处理后的图

网上时不时有相近招聘如下的选聘消息: 

您说的这么些问题,不是过五个人可以应对的,我也只能把自家领悟的告知你。
isp 是image signal processing,用于图像处理,比如gamma调整,dynamic range
correction,smmoth,sharpness,format convert,resize,edge enhancement
,color correction等操作都是此处形成的

3aa 是ae/af/awb algorithms
3aa
的硬件模块分析输出3a的总计信息。3aa软件是分析总括音讯值举办算法处理。

二、完美反射算法

     
当初写这一个代码的时候的部分参考文献一下子也找不到了,就从曾经写好的代码中描述下该算法的经过吧。

     
原理:完美全反射理论perfect Reflector假若图像上最亮点就是白点,并以此白点为参照对图像举行机动白平衡,最亮点定义为R+G+B的最大值,具体编码步骤如下:

     
(1)总计每个像素的R\G\B之和,并保存到一临时内存块中。

            for (Y = 0; Y < Height; Y++)
            {
                Pointer = bmp.Pointer + Y * Stride;
                for (X = 0; X < Width; X++)
                {
                    Sum = (short)(*(Pointer) + *(Pointer + 1) + *(Pointer + 2));     // R+G+B
                    HistRGB[Sum]++;
                    *SumP = (short)Sum;
                    Pointer += 3;
                    SumP++;
                }
            }

     (2)按R+G+B值的大大小小总计出其前10%或另外Ratio的反革命参考点的的阈值T。

            for (Y = 767; Y >= 0; Y--)
            {
                Sum += HistRGB[Y];
                if (Sum > Width * Height * Ratio / 100)
                {
                    Threshold = Y;
                    break;
                }
            }

   
(3)遍历图像中的每个点,总括其中R+G+B值大于T的所有点的R\G\B分量的聚积和的平均值。

            for (Y = 0; Y < Height; Y++)
            {
                Pointer = bmp.Pointer + Y * Stride;
                for (X = 0; X < Width; X++)
                {
                    if (*SumP > Threshold)
                    {
                        AvgB += *Pointer;
                        AvgG += *(Pointer + 1);
                        AvgR += *(Pointer + 2);             // 为获得增益做准备
                        Amount++;
                    }
                    Pointer += 3;
                    SumP++;
                }
            }
            AvgB /= Amount;
            AvgG /= Amount;
            AvgR /= Amount;

   (4)对各样点将像素量化到[0,255]之间。

            for (Y = 0; Y < Height; Y++)
            {
                Pointer = bmp.Pointer + Y * Stride;
                for (X = 0; X < Width; X++)
                {
                    Blue = *Pointer * MaxValue / AvgB;                                   // 另外一种算法需要先计算不抑制重新计算的RGB的范围,然后求RGB的最大值,如果最大值大于255,则所有的结果都要除以最大值在乘以255,但实际表明该算法、   不合适;
                    Green = *(Pointer + 1) * MaxValue / AvgG;
                    Red = *(Pointer + 2) * MaxValue / AvgR;
                    if (Red > 255) Red = 255; else if (Red < 0) Red = 0;                // 这里需要判断,因为RGB空间所有的颜色转换到YCbCr后,并不是填充满了0-255的范围的,反转过去就会存在一些溢出的点。
                    if (Green > 255) Green = 255; else if (Green < 0) Green = 0;        // 编译后应该比三目运算符的效率高
                    if (Blue > 255) Blue = 255; else if (Blue < 0) Blue = 0;
                    *Pointer = (byte)Blue;
                    *(Pointer + 1) = (byte)Green;
                    *(Pointer + 2) = (byte)Red;
                    Pointer += 3;
                }
            }

  图片 7 
 图片 8 
 图片 9

     图片 10 
  图片 11 
 图片 12

     图片 13 
  图片 14 
 图片 15

                                原图                  
                               Ratio=10%                                
           Ratio=2%

    从效果上看,该算法应该比灰度世界的职能要好些,可是也依然遭到Ratio那一个参数的印象。特别是第二个图片,过高的Ration导致图片过于泛白。那多少个题目得以如故最终量化的哪一步引起的,我会抽空再切磋一下此外的量化情势,尽量降低Ration的熏陶。

   
针对上述的第二步,看到不少matlab和VC的代码,有那个人竟然先用急迅排序对增长后的数据开展排序,然后再取其10%的最大值,对图像的数量举行排序,可能就是再飞快的排序都快不起来吧,看到这,也许全国人民都笑了。

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

两岸关系是,数据经过3aa处理后,传递isp举行图像处理,3aa
算法的部分动作是内需isp硬件完成的。

三、动态阈值算法

      参考杂谈:A Novel Automatic White
Balance Method For Digital Still
Cameras

     
同经典的一对算法相同,算法分为两个步骤:白点检测和白点调整。

      白点检测:

         
 (1)为了增进算法的鲁棒性,原文将图像分成12部分,其中宽高比为4:3,关于这或多或少,我以为不客观,对图像不是通用的,后文再说。

           
(2)总结每个区域的Cb\Cr分量的平均值Mb/Mr

           
(3)按下式总结每个区域的Cb\Cr分量的断然差的累积值Db/Dr

                               
 图片 16

                               
 图片 17

                  上式中N为每个区域的像素数。

       
 (4)如果Db/Dr的值偏小,则大家忽视这一块,因为这声明这一块的颜色分布相比均匀,而这样的片段对于白平衡欠好。这些偏小的准则大家有些再谈。

       
 (5)总计对于除了符合第四条的的其余区域的Mb/Mr/Db/Dr的平均值作为整幅图像的Mb/Mr/Db/Dr值。

        关于这一条,原文的话是:The final
Mb、Mr、Db、Dr are obtained by taking the average
of those regions that pass this additional step。

       我在实际上中做的时候就是个别对每块举行的,似乎效果也还不错。

       
 (6)按下述规则初始确定如何点是属于白色参考点:

                     
 图片 18

                     
  图片 19

       
 (7)对于起头判断已经属于白色参考点的像素,按大小取其亮度值为前10%的位最后确定的白色参考点。

     
白点调整:

     (1)统计白色参考点亮度值的平均值Raver,Gaver,Baver,(各通道分别总计)。

         
(2)遵照以下各式总计每个通道的增益:

           
 图片 20

                     
 图片 21

                   
  图片 22

             
式中,Ymax就是YCbCr颜色空间中Y分量的在整幅图像中的最大值。

         
(3)按照以下各式总计最终每个通道的颜色值:

                   
  图片 23

                   
  图片 24

                   
  图片 25

         
其中R/G/B为在原有的颜色空间中的值,注意这里要开展溢出检测的。

      
 简单的谈下白点检测的分块操作吧,原文把图像分成4*3的12快,那样工作针对于大家广大数码照片是以此比重的,假使通用,我以为应该用每个块的轻重缓急来决定,比如每块为
100*100个像素。

         
那么些算法的效率如下:

   
  图片 26  图片 27  图片 28

   
  图片 29  图片 30  图片 31

   
  图片 32  图片 33  图片 34

                     
     原图                                            
 块大小50*50                    块大小100*100

     
上三图讲明:1、该算法效果分外好;2、对块大小不太敏感,因而分外适合于自动化操作。

      
关于RGB到YCbCr的急速转移,可以参考:颜色空间系列3:
RGB和YCbCr颜色空间的转移及优化算法 

     
由于在上述链接的篇章中,YCbCr颜色空间已经被撤换到[0,255],由此白色检测部分的第(6)条中的sign函数就不需要了。

   
  同样,提供个编译好的公文给有趣味商量该算法的爱侣看看效果:

   
  http://files.cnblogs.com/Imageshop/AutoWhiteBalance.zip

   后记:

   
 针对动态阈值法,很多对象反映假如YCbCr的值量化在0到255里头的话会冒出所有的像素都会被式(6)起始判断为白色参考点。这样先前时期的工作就失去了意思,算法就改为了近乎于健全反射算法这了,稍微有点不同的地点就是两者采纳两点的轨道有所不同。尽管这么做的结尾结果还算不错,但实在和舆论的原意像违背了,后边经过实践,假使把YCbCr的值量化在-127到128里面,式6中的Sgn同样适用,则起头判断为白点的数会大量的压缩,对于同一个图纸,同一个参数多少个算法的末段的功力相比较如下:

  
更新后的下载链接依旧如下,以充实了更正后的效益。

     
图片 35 
图片 36  图片 37

      图片 38 
图片 39 
图片 40

 

 图片 41

 ***************************作者:
laviewpbt   时间: 2013.4.20    联系QQ:  33184777
 转载请保留本行音信*************************

 

 

Camera/ISP 算法工程师
视频机3A算法软件工程师 

编辑于
2015-11-20
 7
条评论
 感谢 

这边随机摘录部分具体要求。

分享

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

 收藏 • 没有帮衬 • 举报 • 笔者保留权利

供职要求:

0赞同

  1. 了解camera的3A(AE,AWB,AF)算法原理和统筹思路,
    有3A算法的计划性经验为佳
  2. 所有充裕ISP(图象处理器) 开发经历,熟习MTK,QUALCOMM,
    OV等便携式终端上运用的ISP开发条件。有上述条件下支付经历为佳。
  3. 了然数字图像处理原理和基础知识。
  4. 熟知C/C++语言,有开发经历为佳
  5. 有部手机/便携式相机3A算法实现/应用经验
  6. 领会CMOS sensor的干活原理

反对,不会显得你的全名

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

图片 42不二手机Camera驱动工程师

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

 

下一场问题来了,市面上3A算法相关材料都不行少见,就连相关书籍都很少提及算法细节,而她们大多都会要求了解3A算法至少之一。

3A:
AE/AF/AWB
。对应的是相机的机能,即自动曝光,自动对焦和活动白平衡。六个成效的实现都亟需软硬件结合起来实现。但基本都是一个负反馈闭环控制系统,即状态硬件模块输出亮度值/FV值/灰度空间,然后对应的3A算法举行总计反馈到相应的处理单元做处理,知道相应的值稳定下来。

而至于白平衡算法,相比较不错的资料是这份:

ISP:Image Signal Processor
,即图像信号处理器,形式上指一个硬件,和CPU类似。但现在
ISP都是泛指,因为相机硬件中众多独立硬件模块组合,如做色彩转换的,做滤波降噪的,有做裁剪,做旋转的。

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

事先反复与博主laviewpbt研商相关的文化,收益匪浅。

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

贴一下《遵照灰度世界、完美反射、动态阈值等图像自动白平衡算法的法则、实现及效益》灰度世界法的大体内容。

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

灰度世界算法(格雷 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

经过实测,这样的拍卖后效果还不错。

贴上相比图:

图片 43

原图

图片 44

均值法

图片 45

灰度法

单从眼睛上去分辨两张图片,的确很难分出上下。

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

接下去自己要说的是具体相机中的钨丝灯等手动白平衡是什么样贯彻的。

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

那么遵照灰度世界这多少个白平衡算法能够怎么落实这种调节呢?!

此间贴出简单实现的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,
};

 

图片 46

阴天

图片 47

日光

图片 48

白热光

图片 49

日光灯

图片 50

钨丝灯

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

本文只是抛砖引玉一下,若有任何连锁问题或者需要也能够邮件联系自己琢磨。

 邮箱地址是:

gaozhihan@vip.qq.com

相关文章