一、概述

由于成本和面积等因素的限定,CMOS图像传感器在成像时,感光面阵列前通常会有CFA (color filter array),CFA过滤不同频段的光,因此,Sensor的输出的RAW数据信号包含了3个通道的信息。

CFA的排列方式一般有以下几种:

现在应用最广泛的是Bayer CFA。 用Bayer CFA制作的传感器的原始输出是每个像素点只有红、绿或蓝一种颜色分量的马赛克图像。由于人眼对绿色(大约550nm波长)光更敏感,因此Bayer CFA阵列包含1/2的G分量,1/4和R和1/4的B分量。

为了实现图像从Bayer模式到全彩色的图像的重建, 需要对图像中的每一个像素点进行插值, 利用其周围像素点的色彩值来估计出缺失的另外两个色彩值, 最终得到一个每个像素点包含红、绿、蓝三个像素值的全彩色图, 这个过程就叫做去马赛克。

现存的去马赛克方法按照是否利用相关性原则可以分为两大类:

一种是没有利用相关性的插值方法。例如最近邻域复制, 双线性插值, 三次样条插值等方法。在这些方法中未知的绿色分量值仅由已知的绿色像素值进行估算, 对红色和蓝色通道也采用同样的方法。其中最典型的是双线性插值法。这一类算法容易实现, 在平滑区域内也可以得到比较满意的效果, 但在高频区域, 尤其是在边缘区域却失真明显。

另一种是利用相关性的插值方法。相关性包括每个色彩通道内像素之间空间关系的相关性和多通道间色彩的相关性。利用相关性的去马赛克算法效果明显优于不利用任何相关性的算法。

二、常见失真现象

1、拉链效应

拉链效应也叫锯齿效应。在图像从低频跳到高频时, 插值不是沿着边缘而是穿过边缘, 边缘部分会产生模糊和颜色溢出。插值后在水平或垂直方向上出现有一些像素点有规律的间隔分布, 就称为拉链效应。如下图所示:

2、虚假色现象

虚假色是指在去马赛克图像中出现原图像中没有的色彩条纹现象, 是图像重合失调和不适当的邻域平均所致, 经常出现在色彩的轮廓处。对于这种噪声, 图像处理的一般方法是采用中值滤波。如果用传统的灰度图像中值滤波用到色彩图像中, 即对彩色图像的三个色彩通道分别进行处理, 很容易产生新的虚假色。

3、摩尔纹效应

摩尔纹是数码照相机等设备上的感光阵列出现的高频干扰, 使得图片出现彩色的高频率不规则的条纹, 如果感光元件CMOS像素的空间频率与影像中条纹的空间频率接近时, 就极易产生摩尔纹。

根据奈奎斯特采样定理, 图像传感器能够分辨的最高空间频率等于其空间采样频率的一半, 当影像中的条纹空间频率超传感器阵列的空间采样频率的一半时, 影像频谱在频域坐标系上的周期性重复就会造成频域的混叠。混叠的信号经过电路低通滤波后是无法去除的, 并伴随有用信号一起输出, 影响了图像的的主观视觉效果, 甚至出现条纹干扰。

为了减少摩尔纹的发生, 大多数数码相机会在彩色滤波阵列之前增加一个低通滤波器, 滤除部分高频信号, 通过降低图像锐度的方法来减少摩尔纹的发生概率。或者可以通过提高感光阵列的像素密度来提高空间采样频率。

三、常见的算法

下面介绍的算法将以Bayer阵列为例进行说明,像素说明如下:

1、双线性插值法

双线性插值法属于单通道独立插值法, 作为最传统、简单、基础的插值算法之一, 它仍然是理解并设计新型算法的基础, 对参考评估其它算法的性能仍具有广泛的意义。

Bayer提出Bayer滤波阵列时, 为了得到全彩图像, 用的就是双线性插值。从采样阵列上可以看出, 在R或B值的周围上下左右四个方向都有已知的G值,以此来估计出在或上缺失的G值;利用在G的上下或者左右的两个已知的R或B值估计出缺失的R或B的值。具体算法如下:

  1. 红蓝像素点上的G值由相邻的4个绿像素点求均值得到。
  2. 绿像素点上的R或B值由相邻的2个红或蓝像素点求均值得到。
  3. 红像素点上的B值由对角线上的4个蓝像素点求均值得到。
  4. 蓝像素点上的R值由对角线上的4个红像素点求均值得到。

由于双线性法是单通道之间独立插值, 并且始终取3*3滤波器平均值, 忽略了图像的细节信息以及图像三个颜色通道之间的相关性, 所以往往不能得到满意的插值效果, 容易在边缘处产生虚假色, 也不可避免的产生彩色摩尔纹。

2、色比恒定法

事实上, 不同的颜色通道间具有很强的相关性。提出的基于常色调的插值方法是比较早的考虑了不同颜色通道间的相关性的算法之一。该算法也是早期应用于数码相机系统的算法之一。

“Mondriaan”(蒙德里安)彩色图像成像模型, 是基于对彩色图像形成方式的一种简化模型。人眼看到的图像一般是通过光照射到目标上反射进行度量的, 所以平面图像A(x,y) 基本上由两部分构成:一是入射到可见场景上的光的量, 二是场景中目标反射光的量。它们分别称为照度成分i(x,y)与反射成分r(x,y)。其中, i(x,y)由光源的特性来决定, r(x,y)则由场景中目标的物理属性等来确定, 并且因不同波长的颜色而不同。根据这一模型,三个颜色通道可以表示为:

这说明不同颜色通道的差别主要是反射率`不同, 根据上面的公式, 可以看出, 对于同一种物质以及固定的位置, 反射率是一个固定的常数, 因此对同一物质同一位置, 三颜色通道光强的比例是一个常数, 如下式所:

根据上面的结果可以推断, 在一个平滑的小邻域内, 由于图像的色彩亮度是均匀过渡的, 不会有很大的突变, 因此可认为两种通道的强度比成恒定的值。这一简化模型看起来过于简单, 但它符合图像成像局部区域的物理特性, 因而在图像处理过程中很有用。

假设(i,j)邻近的一个采样点是(m,n) , 则下面两等式同时成立:

上面的式子中,为测量的值,是插值得到的值,为了计算出,将上式变形得到:

利用上面的结论进行插值, 首先利用双线性法则重建出绿色分量, 此时整幅图像的绿色分量均可以插值获得, 然后用色比恒定来重建红色和蓝色通道的信息:

可以看到, 尽管利用了色彩相关性, 但是基于常色调的插值方法的本质还是双线性插值方法。由于这种方法在任何邻域中都认为色彩值很接近, 色调变化平缓, 因此该方法在平滑区域内有较好的效果, 但当色调突然变化时, 如在边缘的地方, 还是会产生很多虚假色现象。另外, 还应该考虑的是分量为零的情况,这时色比趋向于无穷大, 图像也会反映出很多虚假色的情况, 因为在使用这种插值方法时必须仔细的分析图像的相关结构, 尽可能的排除不利因素, 以求达到理想的效果。

3、基于边缘的插值算法

人眼视觉对图像中的边缘非常敏感, 如果不考虑图像的这种局部空间结构就会产生较多的问题, 文献中有一类算法就是考虑边缘方向的算法。如果能够正确的找到图像的边缘, 沿着边缘方向上进行插值, 那么虚假色现象将得到很好的抑制。本节将描述几种比较有效的寻找边缘的插值方法。

1)边缘敏感性算法

通过计算一阶微分即采用亮度分量来确定参考像素点可能的边缘方向, 主要做法是计算出像素点水平和竖直方向的梯度算子重建出该点的绿色分量, 具体算法如下:

为了在R/B的位置上插值G值, 则需要在R/B位置做方向判断, 为此, 定义了两个梯度, 一个水平方向, 一个垂直方向。以为例:

定义门限值,则的值为:

在插值R通道时, 可以用到的基本思想是基于色差的插值算法。我们认为在图像的小平滑区域内, 色差是恒定的。

B通道插值则类似,不再详细写出。

2)计算二阶微分的边缘插值方法

通过计算二阶微分即色度分量来确定边缘方向。这里是拉普拉斯算子。拉普拉斯算子是一种
各向同性的二阶微分边缘检测算子, 它是一个线性的, 平移不变的算子,离散情况下, 用差分定义二阶微分:

图像经过二阶微分之后, 在边缘处产生一个陡峭的零交叉, 根据这个零交叉判断边缘。由于图像边缘处的一阶微分是极值点, 图像边缘处的二阶微分应为零,确定零点的位置要比确定极值点更容易, 也更准确。
        该算法的基本思想依然是计算出像素点水平和竖直方向的梯度算子重建出该点的绿色分量, 不同点在于该算法并不是用分量的值来确定方向梯度算法, 而是利用了像素点本身的色彩分量:

剩下插值方法与上小节相同。

3)自适应插值法

这种自适应插值法, 实际上是对前两种算法的一个改进, 算法仍然是首先通过边缘检测来重建出绿色通道的分量, 随后重建色度信号, 同时把边缘检测的原理也引入到色度信号的重建中。

本算法中为了更准确的定位图像中像素点的水平和垂直方向, 利用同一方向上的亮度相似性和色彩相似性共同作为方向判断的依据, 某一方向梯度越小, 说明那个方向上的像素值越接近, 判断方向后对值用双线性插值, 并用的二阶微分做修正。具体过程如下:

在R和B的位置上插G值。 在 位置上考虑:

那么,插值结果如下:

在G和B的位置上插R值。

G有相邻R值,则插值为

B无相邻R值,两个对角线上有己知的色彩值。这种情况比较复杂, 本算法并没有继续采用前两种方法那样取两个对角线的平均, 而是检查使用梯度检测的思想, 又定义了两个对角线上的梯度如下以为例:

则插值方法如下:

在R和G的位置上插B值的方法与插值R通道类似,这里不再详细写出。

Demosaic算法学习相关推荐

  1. 拿下斯坦福和剑桥双offer,00后的算法学习之路

    董文馨,00后,精通英语,西班牙语.斯坦福大学计算机系和剑桥大学双Offer,秋季将进入斯坦福大学学习. 10岁开始在国外上学:12岁学Scratch: 13岁学HTML & CSS: 14岁 ...

  2. 好久没有看到这么有建设性德文章,由衷地赞叹《知其所以然地学习(以算法学习为例)》-By 刘未鹏(pongba)

    知其所以然地学习(以算法学习为例) By 刘未鹏(pongba) C++的罗浮宫(http://blog.csdn.net/pongba) Updated(2008-7-24):更新见正文部分,有标注 ...

  3. 原创 | 初学者友好!最全算法学习资源汇总(附链接)

    在计算机发展飞速的今天,也许有人会问,"今天计算机这么快,算法还重要吗?"其实永远不会有太快的计算机,因为我们总会想出新的应用.虽然在摩尔定律的作用下,计算机的计算能力每年都在飞快 ...

  4. 基本算法学习(一)之希尔排序(JS)

    参考书: 严蔚敏-数据结构 希尔排序(Shell's Sort) 希尔排序又称"缩小增量排序",归属于插入排序一类,简单来说,和我们的插入排序比,它更快. 奇妙的记忆点: 内排序( ...

  5. 大顶堆删除最大值_算法学习笔记(47): 二叉堆

    堆(Heap)是一类数据结构,它们拥有树状结构,且能够保证父节点比子节点大(或小).当根节点保存堆中最大值时,称为大根堆:反之,则称为小根堆. 二叉堆(Binary Heap)是最简单.常用的堆,是一 ...

  6. Surf算法学习心得(一)——算法原理

    Surf算法学习心得(一)--算法原理 写在前面的话: Surf算法是对Sift算法的一种改进,主要是在算法的执行效率上,比Sift算法来讲运行更快!由于我也是初学者,刚刚才开始研究这个算法,然而网上 ...

  7. 算法学习:后缀自动机

    [前置知识] AC自动机(没有什么关联,但是看懂了会对后缀自动机有不同的理解) [解决问题] 各种子串的问题 [算法学习] 学习后缀自动机的过程中,看到了许多相关性质和证明,但是奈何才疏学浅(lan) ...

  8. 算法学习:后缀数组 height的求取

    [前置知识] 后缀数组 [定义] [LCP]全名最长公共前缀,两个后缀之间的最长前缀,以下我们定义 lcp ( i , j ) 的意义是后缀 i 和 j 的最长前缀 [z函数] 函数z [ i ] 表 ...

  9. 算法学习:最小圆覆盖

    [参考博客] https://www.cnblogs.com/bztMinamoto/p/10698920.html [定义] [圆]一个圆心和他的半径,就能够确定这个半径 [解决问题] 字面意思 给 ...

最新文章

  1. 网路游侠:某软件版WEB应用防火墙试用
  2. Luogu P4336 [SHOI2016]黑暗前的幻想乡(容斥,矩阵树定理,子集反演)
  3. 《每日一题》49. Group Anagrams 字母异位词分组
  4. python expected an indented block什么意思
  5. ACdream1157 Segments(CDQ分治 + 线段树)
  6. 贾跃亭时隔四个月再发声 这次还是为了法拉第未来
  7. C Tricks(十九)—— 求以任意数为底的对数
  8. vue学习(9)-路由守卫
  9. Go语言内存对齐详解
  10. 一些自己收藏的有用的资料
  11. 攻防世界misc——flag_universe
  12. 【计算机网络】信源编码——香农三大定理
  13. ros运行cpp文件
  14. 《MLB棒球创造营》:走近棒球运动·纽约扬基队
  15. 网店三大要素:产品、运营与品牌
  16. git提交代码出现 fatal: The remote end hung up unexpectedly-错误处理
  17. 求小于整数N的最大素数
  18. 宁波诺丁汉大学计算机学院官网,宁波诺丁汉大学电子通讯及计算机工程(含实习)硕士课程...
  19. 【Vue基础】关于Vue中CSS的scoped属性作用域与样式穿透
  20. flv.js php,B站视频开源代码flv.js+HTML5无flash播放视频

热门文章

  1. ExtJS4.2学习(10)分组表格控件--GroupingGrid(转)
  2. jQuery编写widget的一些窍门
  3. NSString拼接字符串和NSPredicate详解
  4. Win10卸载python总是提示error2503失败各种解决办法
  5. 《算法竞赛进阶指南》0.5排序
  6. commit之后,想撤销commit
  7. 深入理解Activity启动流程(二)–Activity启动相关类的类图
  8. linux性能分析常用的命令
  9. 设计模式之PHP项目应用——单例模式设计Memcache和Redis操作类
  10. 二:Go编程语言规范-类型