Bayer to RGB

背景

图像传感器:将光线转化成电流,光线越亮,电流的数值就越大;光线越暗,电流的数值就越小。

图像传感器的表面,分成若干个捕捉点,每个点都会产生一个数值,表示该点感受到的光线亮度,这就叫做“像素”。像素越多,图像细节就越丰富。但是,图像传感器有一个很严重的缺陷:它只能感受光的强弱,无法感受光的波长。由于光的颜色由波长决定,所以图像传播器无法记录颜色,也就是说,它只能拍黑白照片,这肯定是不能接受的。

一种解决方案是照相机内置三个图像传感器,分别记录红、绿、蓝三种颜色,然后再将这三个值合并。这种方法能产生最准确的颜色信息,但是成本太高,无法投入实用。


概述

1974年,柯达公司的工程师——拜尔,提出了一个全新方案,只用一块图像传感器,就解决了颜色的识别。他的做法是在图像传感器前面,设置一个滤光层(Color Filter Array, CFA),上面布满了滤光点,与下层的像素一一对应。如下图所示:

Bayer to RGB

每个滤光点只能通过红、绿、蓝之中的一种颜色,这意味着在它下层的像素点只可能有四种颜色:红、绿、蓝、黑(表示没有任何光通过)。

不同颜色的滤光点的排列是有规律的:每个绿点的四周,分布着2个红点、2个蓝点、4个绿点。这意味着,整体上,绿点的数量是其他两种颜色点的两倍。这是因为研究显示人眼对绿色最敏感,所以滤光层的绿点最多。

Bayer to RGB

每个滤光点周围有规律地分布其他颜色的滤光点,那么就有可能结合它们的值,判断出光线本来的颜色。
以黄光为例,它由红光和绿光混合而成,那么通过滤光层以后,红点和绿点下面的像素都会有值,但是蓝点下面的像素没有值,因此看一个像素周围的颜色分布有红色和绿色,但是没有蓝色,就可以推测出来这个像素点的本来颜色应该是黄色。
这样,对比前面说到的全色传感器(内置R,G,B三个图像传感器),使用Bayer阵列的传感器数量为使用全色传感器的1/3。


Bayer插值补偿算法(Bayer Interpolation)

前面说到,每一个像素仅仅包括了RGB中的一种,必须通过插值来实现每个像素的RGB值。为了从Bayer格式得到每个像素的RGB格式,我们需要通过插值填补缺失的2个色彩。插值的方法有很多(包括领域、线性、3*3等),速度与质量权衡,最好的是线性插值补偿算法。算法流程如下:

1)红(R)蓝(B)插值算法的实现

Bayer to RGB

对于上图两种分布中,中间像素点G的RB值的计算通过线性领域插值得到,即R和B的值分别为G领域两个R的平均值和两个B的平均值。

2)绿(G)插值算法的实现

Bayer to RGB

上图左的中间像素点R的B值由1)方法得到,上图右的中间像素点B的R值也是由1)方法得到。但是,由于人眼对绿光反应最敏感,对紫光和红光则反应较弱,这两个像素的G值需要特殊处理得到,以达到更好的画质。上图扩展开来得到下图:

Bayer to RGB

上图左的中间像素点G的取值算法如下:

Bayer to RGB

上图右的中间像素点G的取值算法如下:

Bayer to RGB

上述求G值的算法算法复杂度较高,速度上会有所限制。因此为了提高速度,可以直接通过对四个领域像素的G值取均值来得到中间像素的G值,将会降低一倍的速率,而在效果上差之甚微,算法如下:

Bayer to RGB

如果希望通过损失图像的质量,来达到更快的速度,还可以取G1和G2的均值来实现,但是这样的做法会导致边沿跳变以及部分的失真。