ISP图像处理之Demosaic算法及相关

CFA及Demosaic介绍

1.Bayer(拜耳滤波器得到彩色)

图像在将实际的景物转换为图像数据时, 通常是将传感器分别接收红、 绿、 蓝三个分量的信息, 然后将红、 绿、 蓝三个分量的信息合成彩色图像。 该方案需要三块滤镜, 这样价格昂贵,且不好制造, 因为三块滤镜都必须保证每一个像素点都对齐。


(光线透过镜头然后通过颜色分离片分离 R G B信息,示意图来自《颜色插值算法改进及其电路设计》)

通过在黑白 cmos 图像传感器的基础上, 增加彩色滤波结构和彩色信息处理模块就可以获得图像的彩色信息, 再对该彩色信息进行处理, 就可以获得色彩逼真的彩色图像。通常把彩色图像传感器表面覆盖的滤波称为彩色滤波阵列(Color Filter Arrays,CFA)。

目前最常用的滤镜阵列是棋盘格式的, 已经有很多种类的, 其中绝大多数的摄像产品采用的是原色贝尔模板彩色滤波阵列(Bayer Pattern CFA)。R、G、B 分别表示透红色、透绿色和透蓝色的滤镜阵列单元。由于人的视觉对绿色最为敏感,所以在 Bayer CFA 中G分量是 R和B 的二倍,在每个像素点上只能获取一种色彩分量的信息,然后根据该色彩分量的信息通过插值算法得到全色彩图像。

2.Demosaic颜色插值 (去马赛克)

当光线通过 Bayer型 CFA(Color Filter Arrays) 阵列之后, 单色光线打在传感器上,每个像素都为单色光,理想的Bayer 图是一个较为昏暗的马赛克图。(见感光元件成像示意图(2))。

根据sensor上感知的光线强度,再结合对应滤光片颜色排列就可以估计出 sensor输出的彩色图像(见bayer滤镜输出图像示意图(3))

首先需要说明的就是demosaiced并不是和字面的意思一样是为了去除电影中的一些打马赛克的图像,而是数字图像处理中用来从不完整的color samples插值生成完整的color samples的方法(因为bayer pattern看起来像一个个马赛克,因此称为去马赛克)。在sensor端通常需要使用CFA滤镜来得到Bayer pattern,而在后面的处理中需要把bayer pattern变成完整的RGB444(真彩色)图像。在ISP中需要有这么一个模块来做。

插值算法

在传统的ISP中有很多算法可以来做这个插值,包括最近邻域法,bilinear 插值,cubic 插值等。

最近邻域法

最近邻插值算法是将目标图像中的点,对应到原图像中后,找到最相邻的整数坐标点的像素值,作为该点的像素值输出。图像会出现明显的块状效应,会在一定程度上损失空间对称性(Alignment)。最近邻法速度最快,没有考虑像素之间的空间关系、色彩关系,效果肯定不佳。

选择最近邻插值算法在图像放大的应用,在demosaic应用距离都相等,选择任意一个或者只选择一侧的像素数值作为插值数值,该方法没有考虑到附近的几个像素点按权重分配。

双线性插值算法

sensor输出一幅Bayer时,每个像素只有R,G,B三个通道中的一个通道的像素,通过插值算法把缺失的像素估计出来,m*n的二维数组插值为m*n*3的3个二维数组

举例说明一下双线性插值,以下图的GRBG bayer矩阵为例

1、以 G 3 , 3 G_{3,3} G3,3 这个点为例,我们需要求出 G 3 , 3 G_{3,3} G3,3点处的RB像素数值, G 3 , 3 G_{3,3} G3,3R 像素数值可以根据 G 3 , 3 G_{3,3} G3,3 左、右两个R 插值得到:

R G 3 , 3 = ( R 3 , 2 + R 3 , 4 ) / 2 R_{G_{3,3}} = (R_{3,2} + R_{3,4})/2 RG3,3=(R3,2+R3,4)/2

G 3 , 3 G_{3,3} G3,3B像素数值可以根据 G 3 , 3 G_{3,3} G3,3 上、下两个B 插值得到:

B G 3 , 3 = ( B 2 , 3 + B 4 , 3 ) / 2 B_{G_{3,3}} = (B_{2,3} + B_{4,3})/2 BG3,3=(B2,3+B4,3)/2

其他的G像素插值RB数值都是这样。

2、以 R 3 , 4 R_{3,4} R3,4 这个点为例,我们需要求出 R 3 , 4 R_{3,4} R3,4点处的GB像素数值,则 R 3 , 4 R_{3,4} R3,4G像素数值可以根据$R_{3,4}斜角四个G像素数值插值得到:

G R 3 , 4 = ( G 2 , 4 + R 3 , 3 + G 3 , 5 + G 4 , 4 ) / 4 G_{R_{3,4}} = (G_{2,4} + R_{3,3} + G_{3,5} + G_{4,4})/4 GR3,4=(G2,4+R3,3+G3,5+G4,4)/4

R 3 , 4 R_{3,4} R3,4B像素数值可以根据 R 3 , 4 R_{3,4} R3,4上下左右四个B 像素数值插值得到:

B R 3 , 4 = ( B 2 , 3 + B 3 , 5 + B 4 , 3 + B 4 , 5 ) / 4 B_{R_{3,4}} = (B_{2,3} + B_{3,5} + B_{4,3} + B_{4,5})/4 BR3,4=(B2,3+B3,5+B4,3+B4,5)/4

同理,在当前点是BR 像素时,插值办法类似之上。

根据同样的原理,我们可以对Bayer图像中的每一个点都进行插值,然后得到插值结果:

颜色相关性原理(色差恒定理论)

色差恒定准则与色比恒定准则都是基于颜色通道之间的相关性,目的都是把颜色通道之间的相关性信息引入颜色插值算法,提高插值的准确性。色差相比于色比有两点优势:

第一,色差的运算简单,更容易实现。第二, 色比在G通道接近0时误差较大,色差不存在这类问题。因此,绝大多数颜色插值算法中使用了色差。

以下图的GRBG bayer矩阵为例

一种基于色差恒定准则的颜色插值算法,定义 K r Kr Kr K b Kb Kb

K r = G − R Kr = G - R Kr=GR

k B = G − B kB = G - B kB=GB

K r Kr Kr举例,对没有R像素数值的像素,需要 K r K_r Kr附近的像素进行数值估计,

K r 3 , 3 = G 3 , 3 − R 3 , 3 = G 3 , 3 − ( R 3 , 2 + R 3 , 4 ) / 2 Kr_{3,3} = G_{3,3} - R_{3,3} = G_{3,3}-(R_{3,2}+R_{3,4})/2 Kr3,3=G3,3R3,3=G3,3(R3,2+R3,4)/2

K r 2 , 4 = G 2 , 4 − R 2 , 4 = G 9 2 , 4 − ( R 1 , 4 + R 3 , 4 ) / 2 Kr_{2,4} = G_{2,4} - R_{2,4} = G9_{2,4}-(R_{1,4}+R_{3,4})/2 Kr2,4=G2,4R2,4=G92,4(R1,4+R3,4)/2

插值的过程也是先对绿色通道插值,得到所有的G,然后再计算R
和B。

(1)绿色G通道的R、B像素插值:

在计算G值之前,需要计算好周围的Kr或者Kb,以R点处的G值为例

R G 3 , 2 = R 3 , 2 + ( K R 2 , 2 + K R 3 , 1 + K R 3 , 3 + K R 4 , 2 ) R_{G_{3,2}} =R_{3,2} + (K_{R_{2,2}} +K_{R_{3,1}}+ K_{R_{3,3}}+ K_{R_{4,2}}) RG3,2=R3,2+(KR2,2+KR3,1+KR3,3+KR4,2)

B点处的G值类似。

(2)红、蓝通道的插值;

以红色为例,有两种情况,分别是G(3,3)点处的R值($ R_{G_{3,3}} ) 和 B ( 2 , 3 ) 点 处 的 R 值 ( ( )和B(2,3)点处的R值(( )B(2,3)R(( R_{B_{2,3}}$))。

R G 3 , 3 = R 3 , 3 + ( K R 1 , 3 + K R 3 , 2 + K R 3 , 4 + K R 4 , 3 ) R_{G_{3,3}} =R_{3,3} + (K_{R_{1,3}} +K_{R_{3,2}}+ K_{R_{3,4}}+ K_{R_{4,3}}) RG3,3=R3,3+(KR1,3+KR3,2+KR3,4+KR4,3)

R B 2 , 3 = G B 2 , 3 + ( K R 2 , 3 + K R 3 , 2 + K R 3 , 4 + K R 4 , 3 ) R_{B_{2,3}} =G_{B_{2,3}} + (K_{R_{2,3}} +K_{R_{3,2}}+ K_{R_{3,4}}+ K_{R_{4,3}}) RB2,3=GB2,3+(KR2,3+KR3,2+KR3,4+KR4,3)

自适应插值算法

双线性插值忽视了各通道间的相关性,插值结果往往带有比较严重的伪彩色。

Hamilton and Adams 考虑到了各颜色通道之间的关系,利用梯度变化即两个通道之差,通常是用G通道分别减去R和B通道来增加通道之间的相关性,再用相减得到的结果进行插值。这种方法考虑了各通道间的关联,因此插值结果伪彩色大大减少

其计算水平梯度和竖直梯度,在计算梯度时综合了亮度分量梯度和使用的拉普拉斯二阶微分算子

插值缺失的绿色

在计算绿色像素值时,不仅使用了边缘方向的像素值进行平均,还使用了色差对平均值进行修正。

1、 计算水平梯度和竖直梯度(以 B 2 , 3 B_{2,3} B2,3举例)

∇ H = 丨 G 2 , 2 − G 2 , 4 丨 + 丨 2 ∗ B 2 , 3 − B 2 , 1 − B 2 , 5 丨 \nabla{H} = {丨G_{2,2}-G_{2,4}丨} + 丨2*B_{2,3}-B_{2,1}-B_{2,5}丨 H=G2,2G2,4+2B2,3B2,1B2,5

∇ V = 丨 G 1 , 3 − G 3 , 3 丨 + 丨 2 ∗ B 2 , 3 − B − 1 , 3 − B 4 , 3 丨 \nabla{V} = {丨G_{1,3}-G_{3,3}丨} + 丨2*B_{2,3}-B_{-1,3}-B_{4,3}丨 V=G1,3G3,3+2B2,3B1,3B4,3

2、分析梯度数值大小,计算插值的G值(梯度数值小,色彩差异小,选择梯度小的方向作为插值方向)

∇ H < ∇ V \nabla{H} < \nabla{V} H<V时,

G B 2 , 3 = ( G 2 , 2 + G 2 , 4 ) / 2 + ( 2 ∗ B 2 , 3 − B 2 , 1 − B 2 , 5 ) / 4 G_{B_{2,3}} = ( G_{2,2} + G_{2,4} )/2 + (2*B_{2,3}-B_{2,1}-B_{2,5})/4 GB2,3=(G2,2+G2,4)/2+(2B2,3B2,1B2,5)/4

∇ H > ∇ V \nabla{H} > \nabla{V} H>V时,

G B 2 , 3 = ( G 1 , 3 + G 3 , 3 ) / 2 + ( 2 ∗ B 2 , 3 − B − 1 , 3 − B 4 , 3 ) / 4 G_{B_{2,3}} = (G_{1,3} + G_{3,3} )/2 + (2*B_{2,3}-B_{-1,3}-B_{4,3})/4 GB2,3=(G1,3+G3,3)/2+(2B2,3B1,3B4,3)/4

∇ H = ∇ V \nabla{H} = \nabla{V} H=V时,

G B 2 , 3 = ( G 1 , 3 + G 2 , 2 + G 3 , 3 + G 2 , 4 ) / 4 + ( 4 ∗ B 2 , 3 − B − 1 , 3 − B 4 , 3 − B 2 , 1 − B 2 , 5 ) / 4 G_{B_{2,3}} = (G_{1,3} + G_{2,2} + G_{3,3} + G_{2,4} )/4 + (4*B_{2,3}-B_{-1,3}-B_{4,3}-B_{2,1}-B_{2,5})/4 GB2,3=(G1,3+G2,2+G3,3+G2,4)/4+(4B2,3B1,3B4,3B2,1B2,5)/4

插值绿色通道缺失的 红、蓝数值

1、插值红像素数值,寻找附近一列或者一行存在红色像素进行权重插值

举例 G 3 , 3 G_{3,3} G3,3

R G 3 , 3 = ( R 3 , 2 + R 3 , 4 ) / 2 + ( 2 ∗ G 3 , 3 − G 3 , 1 − G 3 , 5 ) / 4 R_{G_{3,3}} = ( R_{3,2} + R_{3,4} )/2 + (2*G_{3,3}-G_{3,1}-G_{3,5})/4 RG3,3=(R3,2+R3,4)/2+(2G3,3G3,1G3,5)/4

蓝色插值同上

插值红(蓝)通道缺失的 蓝(红)数值

已知的红色像素值在两条对角线上,算法的思想是计算两条对角线对应的梯度,选择梯度较小的方向插值。

举例以 B 2 , 3 B_{2,3} B2,3举例

定义倾斜梯度 ∇ N \nabla{N} N ∇ P \nabla{P} P

∇ N = 丨 R 1 , 2 − R 3 , 4 丨 + 丨 2 ∗ G 2 , 3 − G 1 , 2 − G 3 , 4 丨 \nabla{N} = 丨R_{1,2}-R_{3,4}丨 + 丨2*G_{2,3}-G_{1,2}-G_{3,4}丨 N=R1,2R3,4+2G2,3G1,2G3,4

∇ P = 丨 R 1 , 4 − R 3 , 2 丨 + 丨 2 ∗ G 2 , 3 − G 1 , 4 − G 3 , 2 丨 \nabla{P} = 丨R_{1,4}-R_{3,2}丨 + 丨2*G_{2,3}-G_{1,4}-G_{3,2}丨 P=R1,4R3,2+2G2,3G1,4G3,2

根据倾斜梯度,选择插值方向:
∇ N < ∇ P \nabla{N} < \nabla{P} N<P时,

G B 2 , 3 = ( R 1 , 2 + R 3 , 4 ) / 2 + ( 2 ∗ G 2 , 3 − G 1 , 2 − G 3 , 4 ) / 4 G_{B_{2,3}} = ( R_{1,2} + R_{3,4} )/2 + (2*G_{2,3}-G_{1,2}-G_{3,4})/4 GB2,3=(R1,2+R3,4)/2+(2G2,3G1,2G3,4)/4

∇ N > ∇ P \nabla{N} > \nabla{P} N>P时,

G B 2 , 3 = ( R 1 , 4 + R 3 , 2 ) / 2 + ( 2 ∗ G 2 , 3 − G 1 , 4 − G 3 , 2 ) / 4 G_{B_{2,3}} = (R_{1,4} + R_{3,2} )/2 + (2*G_{2,3}-G_{1,4}-G_{3,2})/4 GB2,3=(R1,4+R3,2)/2+(2G2,3G1,4G3,2)/4

∇ N = ∇ P \nabla{N} = \nabla{P} N=P时,

G B 2 , 3 = ( R 1 , 2 + R 3 , 4 + R 1 , 4 + R 3 , 2 ) / 4 + ( 4 ∗ B 2 , 3 − G 1 , 2 − G 3 , 4 − G 1 , 4 − G 3 , 2 ) / 4 G_{B_{2,3}} = (R_{1,2} + R_{3,4} + R_{1,4} + R_{3,2} )/4 + (4*B_{2,3}-G_{1,2}-G_{3,4}-G_{1,4}-G_{3,2})/4 GB2,3=(R1,2+R3,4+R1,4+R3,2)/4+(4B2,3G1,2G3,4G1,4G3,2)/4

测试图像
图、kodim19测试图像


图、双线性插值图像


图、自适应插值算法图像


图、双线性插值、自适应插值算法图像对比

双线性插值法使图片变模糊,在图片中栅栏区域有大量的拉链效应和伪彩色失真;自适应插值算法拉链效应会好很多,还是有一点异常需要优化

感兴趣的可以去我的github 跑跑程序

https://github.com/AomanHao/ISP_Demosiac

我的个人博客主页,欢迎访问

我的CSDN主页,欢迎访问

我的GitHub主页,欢迎访问

评论 11
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

AomanHao

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值