打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
好色之图 | CMOS成像如何模拟人眼色彩感受?ISP算法有大招

前言:

这篇文章是我从事ISP研究数年来的一些经验总结,没有用到深奥的理论知识,有的只是根据实际状况来处理的一些常规方法,以及曾经犯过的错误总结。我想把ISP function的原理用简单浅显的语言描述出来,希望对初学者有所帮助。这里的ISP主要是指从CMOS  sensor输出的bayer pattern,到转换成通用的YUV或者YCbCr格式的过程,通常用于USB摄像头/监控摄像头/手机/平板等芯片设计中。

 

3. 图像色彩

尽管CMOS sensor模拟了人眼的三原色(RGB)视觉感受,见figure 1.1.1,但是CMOS的工艺特性和人眼还是有很大的差异,因此需要ISP来辅助,让其色彩尽量接近人的感受。与色彩相关最重要的function是自动白平衡AWB和色彩校正矩阵Color Correction Matrix,其他有饱和度Saturation,色相Hue,另外手机中一般拍照APP有各种色彩效果也会介绍。


这里需要介绍一个图形分析工具:Imatest,这个tool可以帮助分析图像的亮度,色彩,信噪比,锐利度,畸变等很多性能。

 

这个工具提供了评价图像质量的客观标准,有理论有数据,非常好用。不过也不能完全迷信工具,还是要以人眼看到的情况为准,没有完美的数学模型可精确模拟人的视觉感受。有时候测出来的数据很好看,实际效果却很难看。例如,评测数据是基于整幅图像而计算出来的平均值,而人眼往往会特别关注一些个别点,只要某一点不好就会无法接受,而不管其他所有地方都不错。


3.1 自动白平衡AWB

首先介绍一下色温的概念。色温源自普朗克定义的黑体受热辐射,单位是K(kelvin),用于定义光源颜色,热黑体辐射体与光源的色彩相匹配时的开尔文温度就是光源的色温。来看一下色温的大致范围:

 

Figure3.1.1 色温曲线


这是一份在XYZ色彩空间的光源色温曲线,可以看到色彩偏红时色温较低,色彩偏蓝则色温较高。一般烛光在1800K,阴天为5000K,晴天为6500K,蓝色天空在10000K以上。在实际场景中,光源的颜色未必刚好在这条色温曲线上,很可能有一些偏差。

 

AWB要做的事情,是要让白色的物体,在任何色温条件下,都显示成白色,这是sensor色彩校正的第一步。这里先要说明一下人眼就有非常快速和精准的AWB,以至于我们很少察觉到。举例来说,有一张白纸,不论在什么环境下,我们人眼都会认为是白色的,只有在光源色温大幅度且快速切换的一瞬间(例如开灯/关灯),才会感觉到白纸会变色一下,然后马上又变白了。而CMOS sensor拍摄到的图片,受色温的影响很大,而且Sensor 本身对RGB三个分量的敏感度也不一样(figure3.1.2),因此sensor输出的原始图片和人眼所见差异很大。AWB算法就是要克服sensor本身特性和人眼的不一致,以及解决色温对图像色彩的影响。Sensor输出原本色彩和经过ISP校准后的色彩对比如figure3.1.3. 这里ISP中色彩处理包括AWB和CCM.

 

Figure 3.1.2 某款Sensor的RGB分量敏感曲线
 

(上) A 光源

 

(中) CWF光源

 



(下) D65光源

Figure 3.1.3 某款CMOS sensor原始色彩和ISP处理后的色彩比对

 

人眼的AWB是根据周围环境和既往的经验来实现的,这里ISP算法也一样需要经验。针对任意一款sensor和lens的组合,我们都需要做一些实验,通过这些实验来获取相关的数据,作为这个组合的经验值。实验需要一个灯箱,灯箱中有不同色温的几种光源可做选择,通常有A光源,CWF,D65等色温从低到高的几种光源,灯箱背景为纯灰色(和白色等价)。用sensor 拍摄不同光源下的灯箱背景或者标准测试灰卡,抓取原始的Bayer pattern图片。

 

白色和灰色物体,在图像数据中体现为R,G,B三个分量相等,YCbCr domain中Cb和Cr都为128. 我们通常在Bayer pattern domain或者RGB domain中来做AWB算法,那么就是要让白色和灰色物体的R=G=B。我们拍摄到的图片中,这三者是不相等的,我们可以统计出整幅图中平均的两个比例值G/R和G/B,很容易想到,如果对图像中所有的R分量乘以G/R,所有的B分量乘以G/B,那么图像就会变成白色或者灰色。我们可以用G/R和G/B来构建二维空间,观察不同光源条件下这两个数值的分布情况,如下图。

 

Figure 3.1.4 光源在[G/R,G/B]空间的分布图
 

接下来我们需要在这个二维空间中描述一个闭合空间,这个闭合空间代表了可能是白色(灰色)物体的G/R和G/B的取值范围。在上图中,是用一个非常简单的方法,用几条直线勾勒出一个多边形作为闭合空间。这个闭合空间必须包含大部分光源的情况。也就是说,假设有个白色(灰色)物体,不论在何种常见光源下,统计出来的两个数值都会落在这个闭合空间内。这个闭合空间不能太大也不能太小,太大可能有很多其他颜色被误认为白色,太小则容易找不到白色而不稳定。那么如果确定了闭合空间的形状,在拍摄实际场景时,如果场景中有白色/灰色物体,那么就可以统计出落在闭合空间范围的像素点数,以及这个闭合空间内这些像素的平均G/R和G/B,分别记为R_gain和B_gain,对整幅图像的R分量乘以R_gain,B分量乘以B_gain,就算达到白平衡了,同时可以利用这两个Gain获得近似的色温,这里的逻辑关系并不严密,很可能有些物体并非白色而被误认为白色,所以AWB算法总是存在一定的误判概率。如果图像中没有找到落在闭合空间范围内的像素(或者太少不足以用作参考),那么通常会保持原先的R_gain和B_gain,或者采用灰度世界算法。灰度世界算法是假设Sensor 拍到的画面中所有像素的平均色彩应该是灰的,即R=G=B,于是把整幅图像的所有像素(而不仅仅是闭合空间内)都统计进去,计算出一个全局平均的R_gain和B_gain,由于拍摄内容的不确定性,这两个gain可能偏离真实情况很远(例如拍摄鲜艳的红色),因此需要做最大值和最小值限制,避免出现极端异常情况。相比于前面找白色物体的方法,灰度世界算法相对比较稳定,总是能计算出大概的gain值,缺点是很可能不正确,受大色块影响比较严重。在实际应用中,通常会结合这两种方法的优点,加上额外的限制条件,衍生出更加稳定和有效的AWB算法。


在统计上,为了避免大色块对AWB的影响,通常会对图像进行网格状分割,对每个矩形框内的数据独立统计,如果某个网格的数据偏离闭合空间很远的话,就认为是大色块而不参与AWB gain计算。


AWB的精准性是可以通过Imatest 测试的,要求在各种色温下,拍摄24色卡的最下面6个方块不能有颜色,这个通常很容易达到。

 

Figure 3.1.5 Imatest 测试color

 

CMOS sensor拍摄的场景可能时时在变化,每次计算AWB得到的Gain会不一致,有时候甚至相差很多,如果实时调整AWB gain的话会让视频画面的色彩有跳跃感,看起来不舒服。为此,通常会做两点,一是AWB gain计算有一个稳定区间,每次计算所得AWB gain后会映射到某个色温C,假设原先的C和当前计算所得的C差异不大(小于某个阈值)的话,就不做调整,也就是说当画面色温变化不大的时候白平衡不变;二是两次色温差异超过阈值,需要调整的话,要采用渐进式慢慢的调整,例如R_gain原本为1.0,调整为2.0,那么每个Frame gain增加0.01,需要100个Frame才能调整到位,以30fps为例,就需要3.3秒时间,这样画面会渐渐的转变过去,看起来比较柔和舒适,没有闪烁的感觉。

 

3.2 Color Correction Matrix

色彩校正矩阵CCM 通常在RGB domain 进行,并且在AWB之后。AWB把白色校正了,相应的其他色彩也跟着有明显的变化,可以说色彩基本正确了,只是饱和度有点低,色彩略有点偏差。CCM就是要保持白色(灰色)不变,把其他色彩校正到非常精准的地步。先看一下CCM计算公式。

 

 

这里CCM之前的像素为[r,g,b]’,CCM之后的像素为[R,G,B]’。 CCM的实现比较简单,就是一个简单的矩阵运算,它的困难在于如何确定矩阵的系数。我们先分析一下这个矩阵中系数的物理意义。C00表示r分量对R的影响,C01和C02分别表示g和b分量对R的影响,假设CMOS的模型完全吻合人眼模型,那么显然C00=1,C01=C02=0,实际上CMOS image sensor中的滤镜不能完全过滤掉那些不希望看到的光波,如图Figure 3.1.2。CCM前后的效果比对大致如下。


Figure 3.2.1 CCM前后比对


在Figure3.1.2中,X轴表示光波的波长,三条不同color的曲线分别表示某CMOS sensor中三种感光单元对不同光波频率的敏感程度。 CMOS sensor感光单元所接受的光波频率普遍太宽,三种色彩出现混叠,导致图像的色彩不够鲜艳。为了消除这种混叠,CCM中的系数就具有一种普遍的规律,系数C00,C11,C22都大于1,其他的系数则都小于0或者近似0。G对R的影响要大于B对R的影响,所以C01的绝对值要比C02的绝对值大。同样,C21的绝对值要比C20的绝对值大。


CCM不能改变白色。白色意味着r=g=b时,计算结果R=G=B=r=g=b,由此我们可以得出:

 

以上公式是CCM必须坚持的原则,这样原本9个独立的系数可以缩减为6个,我们把C00,C11和C22用其他的系数表示。根据经验我们再设定其他6个系数的取值范围,例如可以约束C01范围是[-3,0],C02范围是[-1,0]。要得出这6个系数的确切数值,过程有点复杂,首先来看Imatest对色彩的评价方法。


拍在灯箱中各种色温下的24色卡图片,从图片中取出24个色块所代表的颜色,转换到Lab色彩空间,和标准的24色卡颜色进行比较。如下图右

 

Figure 3.2.2 Imatest 色彩比较


在Figure3.2.2右侧的图片中,小方块代表24个标准色在Lab空间的坐标,小圆点表示实测出来的24种颜色在Lab空间的坐标,二者之间的连线表示误差大小。通常认为误差越小越好,圆点往外侧偏移表示色彩太鲜艳,往内侧偏移表示色彩太淡,其他方向表示色彩偏差。

 

我们要找出CCM中的系数,也要建立一个和imatest类似的评价体系。先回顾一下ISP框架,在CCM之后还有Gamma,Hue和saturation会对图像色彩和亮度产生影响,而评测的图像是ISP的最终输出。所以要找出CCM系数,首先要建立一个ISP色彩和亮度模型,如下图。我们认为一般情况下用户不需要去调整亮度,对比度,饱和度以及色调等参数,这些模块的默认参数不对图像色彩和亮度产生任何影响。没有影响的模块我都改成灰色,剩下三个有颜色的模块是需要参与CCM系数寻找的。

 

Figure 3.2.3 计算CCM所需要的色彩亮度模型


建好了模型,还需要注意一点:由于sensor的感光动态范围和24色卡标准色有差异,并且图像平均亮度也可能有差异。我们对标准色做亮度调整(乘法)和动态范围调整(调对比度),使之尽量符合当前这张图像的平均亮度和动态范围,见figure3.2.4。换句话说,就是让标准24色下方的6个黑白色块,在变换后的亮度尽可能和当前输出的图像接近。

 

Figure 3.2.4 标准色转换前后比较
 

有了模型和目标之后,接下来就是选择一种机制来找出最优的CCM系数。这里每人都可以发挥个人想象力,尽量找出最优的结果,最“笨”但有效的方法就是遍历,在一定精度条件下遍历所有的可能性,找出误差最小的那组系数。在搜索CCM系数的时候,有不少误区,例如只看色彩误差数据ΔC,当搜索范围设置不合理,图像饱和度偏低的时候,计算出来的ΔC会很小,实际效果很难看。

 

Figure 3.2.5 ΔC很好,饱和度太低


在不同色温下,CCM的系数也有较大的差异,所以一般在ISP中存有多组CCM系数。在实际使用过程中,需要通过AWB计算出当前色温,然后选择合适的CCM系数,或者几组CCM系数的线性组合。在low light Noise较大的情况下,有时还会减小CCM系数绝对值以降低Noise。AWB解决了sensor 的R,G,B敏感度差异和色温的影响,CCM则是纠正R,G,B感光之间的相互干扰,使图像更接近于人眼。两者结合就算把色彩纠正完成了。

 

3.3 Saturation

饱和度Saturation是指色彩的鲜艳程度,在YCbCr空间来看,Cb和Cr等于128时,饱和度为0,|Cr-128|和|Cr-128|越大,饱和度也越大,饱和度的计算公式非常简单。


f(x,s)=(x-128)*s + 128,  x=Cb or Cr,s>=0
 

表达式中s表示饱和度调整幅度,s=1表示不调整,s=0表示灰度图,0<><1表示降低饱和度,s>1表示增加饱和度。

 

Figure3.3.1 Saturation从左到右分别为s=0, 0.5, 1, 2


饱和度调整也可以通过CCM来完成,不过CCM找出的是根据人眼模型得出的标准系数,不宜随意改变。在Ycbcr空间的这种简单计算,适合于根据用户喜好而调整的情况。例如我们知道sony相机拍出的照片色彩比较鲜艳,就可以用这个方法实现。


3.4 Hue

Hue的本意是色彩的转换,在RGB空间有较明显的意义,例如当转过120度的时候红色变成绿色,绿色变成蓝色,蓝色变成红色。至于为什么要这么转,其实也没什么道理,除了特效摆酷外,hue一般不会被用到。但Hue是ISP标配,所以还是要说明一下。在Ycbcr domain,Hue意义不能直观的理解,我知道有用三角函数对Cb和Cr分量处理的方法,于是自己做实验琢磨,下面给出Hue转换的近似算法,如有雷同,纯属巧合。

 

(左)原图                 (中)旋转2π/3                (右)旋转4π/3

Figure 3.4.1 Hue


假设用户设定需要色彩旋转的角度为α,记D=Cb-128,E=Cr-128。D’和E’为转过α后的数值。


D’=D*cos(x) + E*sin(y)
E’=E*cos(y) +D*sin(x)

当α=0,x=0,y=2π;
当α=2π/3,x=3π/4,y=3π/2;
当α=4π/3,x=3π/2,y=3π/4;
当α=2π,x=2π,y=0;


这里我只实验得出了α为4个关键角度时的x和y取值,当α为其他角度时,x和y可用两点之间线性插值得到。变换过程中Y保持不变,Cb’=D’+128, Cr’=E’+128。这里的4个三角函数可以事先由软件计算好,数字IC只要实现乘加运算。从整体效果来看,色彩确实按照期望的方向在旋转,但是并不完美。

 

3.5各种色彩特效

接下来说说YCbCr空间对色彩的一些变化,算法比较简单。
?

- 灰度图:把Cb和Cr直接改为128,Y不变;

- 黑白二值图:在灰度图的基础上,对Y做二值化。一部分取值为0,另一部分取值为255,大致算法为:计算整幅图像均值和局部区域均值,得出一个相对均值,把当前像素和这个相对均值做比较,再对应到一个概率密度分布函数,把当前像素按照这个概率映射成0或者255;如下。

 

 Figure3.5.1 二值图

 

- 冷色调和暖色调;对所有像素的Cb和Cr加上一个固定offset。 

 (左)冷色调Cb+4 & Cr-4                (中)原图                (右)暖色调Cb-4 & Cr+6

Figure 3.5.2 冷色调和暖色调

 

- 各种P图软件中的色调,例如温暖,黄昏,冷清,淡雅,青春等等。大致公式如下:定义一个场景模式,即对所有像素的Cb和Cr分量设定一个目标值Cb_target和Cr_target。

 

Cb’=Cb_targte*α + Cb*(1-α); Cr’=Cr_targte*α + Cr*(1-α);公式中α为调整比例。各种效果如下,第一幅为原图,其他为各种色调。



Figure 3.5.3


3.6 色彩小结

ISP中色彩相关的function就以上几个,就算法复杂度来说,色彩在ISP中是相对较简单的,但是人眼对色彩比较敏感,因此这部分比较重要,需要理解数学计算和实际效果之间的关系,才能恰当自如的满足用户需求。下一章将介绍细节部分。

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
3A+ISP之AWB篇
手机拍摄功能详解
摄像头模组用胶水---高端胶水替代11
pccam
CMOS摄像头调试
【Android Camera】ISP算法处理
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服