分享

好色之图 | 揭开图形信号处理的面纱,看背后的大学问

 海鲧 2017-01-07

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


IC设计中,受限于处理速度,像素级的ISP算法都相对简单,只会用到加/减/乘/比较等基本运算,通常不会用到除法、指数、对数、平方根、三角函数等复杂运算。以1080p 30fps的视频为例,像素处理速度为1080*1920*30=62M pixel/s,每个pixel都需要非常多的基本运算,用pipeline的方式实现连续高速计算。像除法,指数运算或者三角函数,则较多的时钟周期才能完成一次计算,因此不适用于ISP的像素级处理,在算法设计中要尽量避免这些复杂运算。ISP中也有针对整幅图像处理的运算(非像素级),例如白平衡AWB,自动曝光AE和自动对焦AF,这些算法比较灵活,处理速度要求不高,通常由CPU来处理的,任何复杂运算都可以用,只要CPU性能足够。
 

研究ISP算法是一件充满乐趣的事情,原因在于ISP算法没有标准答案,任何ISP算法都没有一个标准协议,每个人都可以自由发挥自己的想象力,目的只有一个,让人眼看得舒服,大家看着好,才是真的好。每个人的想象力各不相同,算法复杂度也是无穷尽,评价ISP算法的优劣,主要就是一个性价比:在一定复杂度要求的条件下,达到最好的图像质量。在学习ISP相关的paper的时候,要关注的重点是算法的原理,或者说出发点,而不是计算公式,因为公式中通常都是复杂运算,难以实际用起来,在理解了原理之后,可以找近似的替代算法来达到相近的效果。
 

从视觉感受来分,我把ISP大致分成亮度,色彩和细节三个部分。亮度是指对图像整体的亮度调整,涉及到的算法有自动曝光Auto Exposure,黑电平校正Black Level Correction,镜头阴影校正Lens Shading Correction,Gamma,High Dynamic Ranger等。涉及到色彩的有白平衡Auto White Balance,色彩校正Color Correction Matrix,饱和度Saturation,色相Hue等。细节的算法主要的去噪Denoise,插值interpolation,缩放zoom,边缘增强edge enhance等。还有一些其他相对特殊的算法,例如自动对焦Auto Focus,防闪烁anti-flick等。一个简化的ISP算法框架如下图。

 

Figure 0.1 ISP简单框架

 


ISP各个基本算法是相对独立的,但是在整体效果呈现上,又是相互关联的。举例来说,Lens Shading Correction这个算法把要图像四周的拉亮,这就导致图像四周的Noise比较大, 而Noise较大的话,edge enhance就要对四周的像素做特殊处理,使得Noise不会被放大,这会导致图像中心相对清晰,四周相对模糊。经常调校ISP的人,对此可能深有体会。诸多ISP算法模块,内在是有一些确定的逻辑关系的,上图中的框架结构,有些顺序是可以改变,有些则不可以改变, 有些改变会导致算法复杂度提升。ISP算法中有不少特性是相互对立矛盾的,例如清晰度和噪声,AWB中的稳定度和精确度,AE中的收敛稳定性和收敛速度等,这些对立的特性,就像天平的两端,需要根据客户需求或者实际应用场景去做平衡。


对ISP的研究学习过程,既有符合构想预期的情况,也有充满意外的时候,同时感叹一下人眼或者说人脑的高复杂度和高灵敏度。ISP的各种数学运算,最终是要让CMOS sensor感应到的图像,转化模拟成人眼/人脑感受到的图像,通过不断的学习和尝试,让各种ISP模块中的数学计算,能够得出期望的图像效果,或者从图像效果反推出算法中的原因所在。一个有经验的ISP算法研究工程师,就是建立起数学计算和图像效果之间的映射关系。


接下来,我将从图像format开始,然后再从图像亮度,色彩和细节三个方面来一一介绍ISP中各个function。

 

1.图像数据格式

图像format有:Bayer pattern, RGB, YUV, YCbCr, JPEG, HSI, HSV, Lab, CMY等。各种Format有其各自的特性,适用于不同的场合。有些format之间可以相互转换,图像质量没有任何变化,有一些转换则会损失一些图像质量。ISP各种算法,在不同图像format中处理的复杂度有较大的差别,效果也会有所不同,大部分ISP算法都有适合自己的format,所以各家的ISP 框架都类似。


1.1 Bayer Patter

从CMOS image sensor输出的图像通常是bayer pattern,也常被称为raw data。Bayer pattern每个pixel只有一个color分量,如figure 1.1。每个方格表示一个pixel,Green分量占了1/2的pixel,red和blue各占1/4的pixel。数据从图像的左上角开始,按照从左往右,从上往下的方向,逐个pixel传输。每个pixel通常是8-bit~12-bit的精度。

 

Figure1.1.1 bayer pattern


Bayer pattern并不适合图像的显示。我们需要首先把它转换成RGB空间,即每个pixel都有完整的R/G/B三个color 分量。如果每个color分量都是8-bit精度,就称为RGB24,常见的*.bmp彩色图像就大部分是RGB24。把bayer pattern转换到RGB的过程,我们称为interpolation,或者demosaic. 

 

Figure 1.1.2 RGB色彩空间

 


1.2 YUV

YUV是一种常见的色彩空间,Y表示亮度,U表示蓝色色调,V表示红色色调。它和RGB之间可以相互转换,转换的计算方法在不同的参考书籍中会有差异。我们参考微软给出的一组计算公式,R/G/B/Y/U/V都用8 bits表示:
Y = ( ( 66*R + 129*G + 25*B + 128) >> 8) + 16
U = ( ( -38*R - 74*G + 112*B + 128) >> 8) + 128
V = ( ( 112*R -  94*G - 18*B + 128) >> 8) + 128

C = Y - 16
D = U - 128
E = V - 128
R = (( 298*C        + 409*E + 128) >> 8)
G = (( 298*C - 100 * D - 208*E + 128) >> 8)
B = (( 298*C + 516 * D        + 128) >> 8)


需要注意的是Y/U/V的取值范围。Y在16~236,U和V在16~240之间。

 

1.3 YCbCr

YCbCr和YUV非常相似,两个Y的意义相同,Cb和U的意义相同,Cr和V的意义相同,二者只是在转换公式的系数略有差异,这很容易导致混淆。ITU-R BT.601给出计算公式如下:

Y=0.299R +0.587G +0.114B
Cr=( 0.500R -0.4187G -0.0813B )+128
Cb=( - 0.1687R -0.3313G +0.500B )+128


此外还有BT.709公式转换系数有点不一样。
 

不论是YUV还是YCbCr(BT.601/BT.709),各个分量代表的实际物理意义是近似的,所以在下面的叙述中,除非特殊声明,一般认为二者是等价的,不再区分。


YUV依照数据量的不同,还可以细分为YUV444,YUV422,YUV420.

 

Figure1.3.1 YUV的三种format


如图所示,YUV444表示每个pixel 有完整的三个分量;YUV422表示水平相邻的两个pixel有各自的Y,共用1个U和1个V;YUV420表示每4个相邻的pixel,有各自的Y,共用1个U和1个V。可以发现,从数据量来看三者的比例关系为3:2:1.5,不过人眼对亮度(Y)变化比较敏感,对色彩(U/V)的变化不敏感, 因此视觉上YUV444和YUV420没有差别。

 

1.4 JPEG

JPEG是最常用的图像压缩标准。图像首先需要转换成YCbCr format。JPEG压缩是对8x8方块中的数据进行。其过程包括DCT,Quantification和Huffman encode。 其中最核心的是量化表,量化系数Qp越小,图像质量越好,但是图像size也越大,反之Qp越大,size越小,质量越差,会出现马赛克,重影等现象。


1.5 HSI

HSI是根据人眼视觉模型建立的一种色彩空间。H是hue,即色调(色相),是一个角度,取值在00~3600之间。S是saturation,即饱和度,取值在0~1之间。I是intensity,即亮度。HSI 和RGB的转换公式如下:

        
HIS转换回RGB的公式如下:

 

Figure 1.5.1


(A)HSI圆锥空间模型。

(B)线条示意图:圆锥上亮度、色度和饱和度的关系。

(C)纵轴表示亮度:亮度值是沿着圆锥的轴线度量的,沿着圆锥轴线上的点表示完全不饱和的颜色,按照不同的灰度等级,最亮点为纯白色、最暗点为纯黑色。

(D)圆锥纵切面:描述了同一色调的不同亮度和饱和度关系。

(E)圆锥横切面:色调H为绕着圆锥截面度量的色环,圆周上的颜色为完全饱和的纯色,色饱和度为穿过中心的半径横轴。

 

这里I也表示为亮度,和Y的概念相同,但是出发点是不一样的。这里I仅仅是RGB三个分量的平均值,定义这个模型的美国色彩学家孟塞尔(H.A.Munseu)显然在这里偷了个懒,YCbCR定义的Y是根据人眼对RGB三种颜色的敏感度差异,分别对RGB选取了不同的权重系数:

Y=0.299R +0.587G +0.114B
 

作为一个有经验的ISP算法工程师,是不会用这个I来做任何运算的。HSI模型的优点在于定义了Hue和Saturation这两个概念。在这个模型中,随着Hue的角度变化,色彩呈现出超出人脑既有感受经验的光怪陆离的变化,让人耳目一新,类似电影特效一般,在实际中一点用也没有。Saturation表示图像色彩的鲜艳程度,虽然计算公式有点粗糙,但概念比较清晰也比较实用。还记得我们之前说过像素级的ISP算法不能有复杂的运算,这里有除法,三角函数,开根号等,所以在ISP算法框架中是不会有HSI 模型的,不过其Hue和Saturation概念是很有意义的,我们可以在YUV空间来模拟这两种效果。

 

1.6 CMY

彩色印刷或彩色打印的纸张是不能发射光线的,因而印刷机或彩色打印机就只能使用一些能够吸收特定的光波而反射其它光波的油墨或颜料。油墨或颜料的三基色是青(Cyan)、品红(Magenta)和黄(Yellow),简称为CMY。

 

这里值得注意的是C/M/Y分别是R/G/B的补色。所谓补色就是下图中任意一条直径两端的两种颜色,互为补色。

 

Figure1.6.1
 

1.7 CIE色度模型

国际照明委员会(CIE,Commission Internationale de L'Eclairage / International Commission on Illumination)的色度模型是最早使用的模型之一。它是三维模型,其中,x和y两维定义颜色,第3维定义亮度。CIE 在1976 年规定了两种颜色空间。一种是用于自照明的颜色空间,叫做CIE LUV。

 

Figure 1.7.1  CIE 1976 Lu’v’色度图
 

另一种用于非自照明的颜色空间,叫做CIE 1976 L*a*b*,或者叫CIE LAB。CIE LAB 系统使用的坐标叫做对色坐标(opponent color coordinate)。CIELAB 使用b*, a *和 L*坐标轴定义CIE 颜色空间。其中,L*值代表光亮度,其值从0(黑色)~100(白色)。b*和a*代表色度坐标,其中a* 代表红-绿轴,b* 代表黄-蓝轴,它们的值从0到10。

 


Figure 1.7.2
 

a*= b* = 0表示无色,因此L* 就代表从黑到白的比例系数。使用对色坐标(opponet color coordinate)的想法来自这样的概念:颜色不能同时是红和绿,或者同时是黄和蓝,但颜色可以被认为是红和黄、红和蓝、绿和黄以及绿和蓝的组合。
 

CIE XYZ 是国际照明委员会在1931 年开发并在1964年 修订的CIE 颜色系统(CIE Color System),该系统是其他颜色系统的基础。它使用相应于红、绿和蓝三种颜色作为三种基色,而所有其他颜色都从这三种颜色中导出。通过相加混色或者相减混色,任何色调都可以使用不同量的基色产生。CIE 1931 色度图(CIE 1931 Chromaticity Diagram),如Figure 1.1.8.3所示,图(b)是它的轮廓图。图(a)中的A点在色度图上的坐标是x =0.4832,y =0.3045,它的颜色与红苹果的颜色相匹配。

 

Figure 1.7.3
 

这几种模型在ISP计算中没有用到,不过在测试或者调校图像质量的时候会用作参考。
 

1.8 小结

以上介绍了几种色彩模型,在ISP中用到的只有Bayer pattern,RGB,和YUV/YCbCr。下一章将开始介绍亮度相关的function。

 

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多