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点处的R 和B像素数值,
G
3
,
3
G_{3,3}
G3,3的R 像素数值可以根据
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,3的B像素数值可以根据
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像素插值R、B数值都是这样。
2、以
R
3
,
4
R_{3,4}
R3,4 这个点为例,我们需要求出
R
3
,
4
R_{3,4}
R3,4点处的G和B像素数值,则
R
3
,
4
R_{3,4}
R3,4的G像素数值可以根据$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,4的B像素数值可以根据
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
同理,在当前点是B或R 像素时,插值办法类似之上。
根据同样的原理,我们可以对Bayer图像中的每一个点都进行插值,然后得到插值结果:
颜色相关性原理(色差恒定理论)
色差恒定准则与色比恒定准则都是基于颜色通道之间的相关性,目的都是把颜色通道之间的相关性信息引入颜色插值算法,提高插值的准确性。色差相比于色比有两点优势:
第一,色差的运算简单,更容易实现。第二, 色比在G通道接近0时误差较大,色差不存在这类问题。因此,绝大多数颜色插值算法中使用了色差。
以下图的GRBG bayer矩阵为例
一种基于色差恒定准则的颜色插值算法,定义
K
r
Kr
Kr、
K
b
Kb
Kb
K
r
=
G
−
R
Kr = G - R
Kr=G−R
k
B
=
G
−
B
kB = G - B
kB=G−B
以
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,3−R3,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,4−R2,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,2−G2,4丨+丨2∗B2,3−B2,1−B2,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,3−G3,3丨+丨2∗B2,3−B−1,3−B4,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+(2∗B2,3−B2,1−B2,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+(2∗B2,3−B−1,3−B4,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+(4∗B2,3−B−1,3−B4,3−B2,1−B2,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+(2∗G3,3−G3,1−G3,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,2−R3,4丨+丨2∗G2,3−G1,2−G3,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,4−R3,2丨+丨2∗G2,3−G1,4−G3,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+(2∗G2,3−G1,2−G3,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+(2∗G2,3−G1,4−G3,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+(4∗B2,3−G1,2−G3,4−G1,4−G3,2)/4
图、kodim19测试图像
图、双线性插值图像
图、自适应插值算法图像
图、双线性插值、自适应插值算法图像对比
双线性插值法使图片变模糊,在图片中栅栏区域有大量的拉链效应和伪彩色失真;自适应插值算法拉链效应会好很多,还是有一点异常需要优化
感兴趣的可以去我的github 跑跑程序
https://github.com/AomanHao/ISP_Demosiac
我的个人博客主页,欢迎访问
我的CSDN主页,欢迎访问
我的GitHub主页,欢迎访问
ISP图像处理之Demosaic算法及相关的更多相关文章
- ISP基本框架及算法介绍
什么是ISP,他的工作原理是怎样的? ISP是Image Signal Processor的缩写,全称是影像处理器.在相机成像的整个环节中,它负责接收感光元件(Sensor)的原始信号数据,可以理解为 ...
- ISP图像处理&&相机系统
如何理解 ISO.快门.光圈.曝光这几个概念? 摄影基础篇——彻底弄清光圈.快门与ISO 理解这三个参数各自都是如何控制进入的光线量: 快门速度一般的表示方法是1/100s.1/30s.2s: 小的“ ...
- 图像Demosaic算法及其matlab实现
由于成本和面积等因素的限定,CMOS/CCD在成像时,感光面阵列前通常会有CFA(color filter array),如下图所示,CFA过滤不同频段的光,因此,Sensor的输出的RAW数据信号包 ...
- 数论算法 剩余系相关 学习笔记 (基础回顾,(ex)CRT,(ex)lucas,(ex)BSGS,原根与指标入门,高次剩余,Miller_Rabin+Pollard_Rho)
注:转载本文须标明出处. 原文链接https://www.cnblogs.com/zhouzhendong/p/Number-theory.html 数论算法 剩余系相关 学习笔记 (基础回顾,(ex ...
- Lengauer-Tarjan算法的相关证明
Lengauer-Tarjan算法的相关证明 0. 约定 为简单起见,下文中的路径均指简单路径(事实上非简单路径不会对结论造成影响). \(V\)代表图的点集,\(E\)代表图的边集,\(T\)代表图 ...
- ISP图像处理算法之---Demosaic
目前市场上主流传感器为Coms传感器,sensor出来的的数据格式为bayer数据格式,这种格式,每个像素点只有三个颜色通道中的一个,如图1所示 ...
- Win8 Metro(C#)数字图像处理--2.66FloodFill算法
原文:Win8 Metro(C#)数字图像处理--2.66FloodFill算法 [函数名称] 洪水填充算法函数 WriteableBitmap FloodfillProcess(Write ...
- c#图像处理的简单算法
原文链接:https://blog.csdn.net/wchstrife/article/details/78984735 使用C#进行图像处理前言之前一直认为图像处理是一件很高大上的事情,在一门选修 ...
- 图像处理------泛洪填充算法(Flood Fill Algorithm) 油漆桶功能
泛洪填充算法(Flood Fill Algorithm) 泛洪填充算法又称洪水填充算法是在很多图形绘制软件中常用的填充算法,最熟悉不过就是 windows paint的油漆桶功能.算法的原理很简单,就 ...
- ISP PIPLINE (四) Demosaic
what is the Demosaic? CMOS/CCD在成像时,CFA(color filter array),CFA过滤不同频段的光,因此,Sensor的输出的RAW数据信号包含了3个通道的信 ...
随机推荐
- SQL优化(二)-- 慢查询
1.慢查询日志 MYSQL的慢查询日志是Mysql提供的一种日志记录方式,它主要是用来记录mysql执行语句过程中,响应时间超过阀值的语句,这个阀值可以通过long_query_time去指定,比如说 ...
- JUC(六)堵塞队列与线程池
堵塞队列 简介 def:在多线程中实现高效.安全的数据传输,主要是通过一个共享的队列,使得数据能够从一端输入,从另一端输出 当队列是空的,取数据的线程就会被堵塞,直到其他线程往空的队列中添加数据 当队 ...
- Puppeteer+RabbitMQ:Node.js 批量加工pdf服务架构设计与落地
全文约8500字,阅读时长约10分钟. 智慧作业最近上线「个性化手册」(简称个册)功能,一份完整的个性化手册分为三部分: •学情分析:根据学生阶段性的学习和考试情况进行学情分析.归纳.总结,汇总学情数 ...
- day05-优惠券秒杀01
功能03-优惠券秒杀01 4.功能03-优惠券秒杀 4.1全局唯一ID 4.1.1全局ID生成器 每个店铺都可以发布优惠券: 当用户抢购时,就会生成订单,并保存到tb_voucher_order这张表 ...
- 聊聊开关和CPU之间故事
目录 开关 电报和继电器 门电路 材料学的发展 继电器与哈佛Mark1号 真空管与巨人一号 晶体管与IBM608 计算机2大特性:计算能力和记忆能力 作者:小牛呼噜噜 | https://xiaoni ...
- Java SE 20 新增特性
Java SE 20 新增特性 作者:Grey 原文地址: 博客园:Java SE 20 新增特性 CSDN:Java SE 20 新增特性 源码 源仓库: Github:java_new_featu ...
- 【Docker】Harbor 分布式仓库管理
一.Harbor 介绍 Harbor 是 VMware 公司开源的企业级 Docker Registry 项目,其目标是帮助用户迅速搭建一个企业级的 Docker Registry (私有仓库)服务. ...
- 2022-10-17:特殊的二进制序列是具有以下两个性质的二进制序列: 0 的数量与 1 的数量相等。 二进制序列的每一个前缀码中 1 的数量要大于等于 0 的数量。 给定一个特殊的二进制序列 S,以
2022-10-17:特殊的二进制序列是具有以下两个性质的二进制序列: 0 的数量与 1 的数量相等. 二进制序列的每一个前缀码中 1 的数量要大于等于 0 的数量. 给定一个特殊的二进制序列 S,以 ...
- 2021-03-19:给定一个二维数组matrix,其中的值不是0就是1,返回全部由1组成的最大子矩形,内部有多少个1。
2021-03-19:给定一个二维数组matrix,其中的值不是0就是1,返回全部由1组成的最大子矩形,内部有多少个1. 福大大 答案2021-03-19: 按行遍历二维数组,构造直方图. 单调栈,大 ...
- 使用Cordova插件实现两个app之间的相互调用和通讯
几年前使用Cordova 进行两个app之间的相互调用和通讯:当时也是几经折腾,今天把它整理出来,理一下思路,也方便有同样需求的朋友参考 一.require引入 plugin require(&quo ...