Bayer滤镜如何转换颜色?

Bayer模式是颜色模式,被广泛应用于CCD和CMOS摄像头。相机使用了拜耳滤镜,分别过滤得到红绿蓝三种颜色。既然要得到的是红绿蓝频段光线的强度,要通过的就是红绿蓝光,就反射了其他频段的光线。

比如说红色滤镜应该是 反射 了除去红色那一个波段的其他光。这里有一个疑问:它是 保留 了人眼可见的感觉是红的500–700nm波长的光可以通过,还是保留那个特定的人眼反应是最红的那个波长可以通过?

因为这好像涉及到复合光(即自然界的各种波长的光叠加)与单纯的RGB(即只有特定那个颜色频率的光,只改变光强叠加出来的光)的转换问题。虽然所有他们可以表示的颜色看起来是不差的(即可以用RGB表示看到的几乎所有复合光的一样的颜色),可是怎么把看起来是某一颜色的自然复合光不差地转换为看起来颜色一样的RGB数值呢?只要看起来是最红的那个波长的光就可以了吗?还是只要有点红的都要。这怎么取舍?取舍之后拍出来照片的颜色是在一定范围内人眼看不出来,但和实际看到的自然色应该是有误差的。

如果是反射其他波长的光那么RGB滤镜看起来是青色(0, 255, 255),紫色(255, 0, 255),黄色(255, 255 ,0)这三个颜色,而非示意图上的红绿蓝。

因为人眼三种视锥细胞对波长的响应是有重叠的部分的。它反射了其余波长的光看起来到底会是什么颜色的?

RGB Bayer Color分析

Bayer色彩滤波阵列

拜耳色彩滤波阵列(Bayer Color Filter Array,CFA)是非常有名的彩色图片的数字采集格式。色彩滤波器的模式如上图所示,由一半的G,1/4的R,1/4的B组成。

拜耳色彩滤波器的模式、序列、滤波器有很多种,但最常见的模式是由Kodak提出的2*2模式。

当Image Sensor往外逐行输出数据时,像素的序列为GRGRGR.../BGBGBG...(顺序RGB)。这样阵列的Sensor设计,使得RGB传感器减少到了全色传感器的1/3,如下所示。

图像传感器的结构如下所示,每一个感光像素之间都有金属隔离层,光纤通过显微镜头,在色彩滤波器过滤之后,投射到相应的漏洞式硅的感光元件上。

白平衡调节(White Balance)

色彩传感器并不能像人眼那样直接感应图像,因此为了保证最终图像的真实性,必须经过一些白平衡处理以及色彩校正等算法来修正图像。

原始像素的第一步处理操作就是白平衡调节。一个白色物体每通道的白平衡都应该是相同的,即R=G=B。通过白色物体的采集以及直方图分析,拥有最高级别白平衡的通道被作为目标通道,而其他两个通道通过增益达到匹配,如下:R'=aG'=bB'。同时,随着光源的不同,白平衡也应该相应的调节。

Bayer插值补偿算法(Bayer Interpolation)

1) 插值红蓝算法实现

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

R和B通过线性领域插值,但这有四种不同的分布,如下图所示:

在(a)与(b)中,R和B分别取领域的平均值。

2) 插值绿算法实现

在(c)与(d)中,取领域的4个B或R的均值作为中间像素的B值。

由于人眼对绿光反应最敏感,对紫光和红光则反应较弱,因此为了达到更好的画质,需要对G特殊照顾。在上述(c)与(d)中,扩展开来就是上图的(e)与(f)中间像素G的取值,者也有一定的算法要求,不同的算法效果上会有差异。经过相关的研究,(e)中间像素G值的算法如下:

(f)中间像素G值的算法如下:

CMOS摄像头这部分转换是在内部用ADC或者ISP完成的,生产商为了降低成本必然会使得图像失真。当然用外部处理器来实现转换,如果处理器的速度足够NB,能够胜任像素的操作,用上面的算法来进行转换。不过上述算法将直接成倍提高了算法的复杂度,速度上将会有所限制。因此为了速度的提成,可以直接通过来4领域G取均值来中间像素的G值,将会降低一倍的速率,而在性能上差之甚微,算法如下:

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

从一个单独平面中得到彩色图像,该平面的R/G/B像素点如下表所示安排。

对像素输出的RGB分量由该像素的1、2或者4邻域中具有相同颜色的点插值得到。Bayer模式可以通过向左或向上平移一个像素点来进行一些修改。比如说,Bayer模式具有很流行的BG类型。

实际上不明白用RGB来表示可见颜色以后。RGB的三个分量的叠加关系是线性叠加。那么对RGB应用数值变换,比如说减去红分量一个数。

CFA的滤过波段不是完美的单一波长的,其实很希望能这样做,因为这样的话各通道分离度越高,对色彩的还原就会越准确。而这个现象反向的话,最极端的结果就是黑白传感器,不能获得任何有效的色彩信息。

CFA的波长透过曲线各个CIS(CMOS Image Sensor)各不相同,这也是拍摄出来图像的色彩表现的一个重要影响因素,比如大家一直说的SONY的色彩表现不佳,这个问题和CFA的性能是绝对离不开的。

比如,CFA透过曲线,就是一个很典型的例子,通过提高RGB分离度来获得更高的色准。

RYYB这种排列,就会导致色彩反算的准确度降低。

CFA的取舍非常重要,这个也算是各个厂商一直在各种攻关的一点了。

拍到的照片的颜色和实际颜色差别是很大的。这个需要通过色彩管理来实现,如何获取XYZ坐标,如何向RGB空间映射,这些展开的话就太多了。

然后是第二问,CFA不是反射无法透过的光,是吸收无法透过的光,所以理论上完美的CFA应该是黑的,不过实际上大家都知道不存在这种完美材料,基本颜色就是和CFA像素对应的颜色看起来是一致的。

然后其实你的最后一个问题是很好的,如果把拍照看作一个图像信息获取的过程的话,其实是非常希望得到全光谱数据而不是单单的RGB数据的。比如微软就做过类似的工作。

这个例子里,对RGB的数值进行变换,本质上是加权减去一部分光谱能量的。但不能从RGB的图片中提取出原始的光谱信息,因为从光谱到RGB的这个映射过程实际上已经把那些数据都拍平了,是一种“降维打击”。

CFA根据techinsight的报告,拍下来看就是红蓝绿的颜色。

Bayer滤镜转换颜色方案的更多相关文章

  1. 2018-9-30-C#-winforms-输入颜色转换颜色名

    title author date CreateTime categories C# winforms 输入颜色转换颜色名 lindexi 2018-09-30 18:27:49 +0800 2018 ...

  2. Ubuntu终端字体颜色方案

    默认: 蓝色代表该文件夹: 绿色代表可运行文件. 红色表示压缩文件. 浅蓝色表示链接文件: 灰色表示其它文件: 红色闪烁表示链接的文件有问题了 黄色表示设备文件. 非常不爽怎么办,改! # Attri ...

  3. 设置vim颜色方案

    获取所有vim颜色配置方案 ls /usr/share/vim/vim74/colors/ [root@lx ~]# ls /usr/share/vim/vim74/colors/ blue.vim ...

  4. css过滤镜实现颜色渐变

    语法:filter : progid:DXImageTransform.Microsoft.Gradient ( enabled=bEnabled , startColorStr=iWidth , e ...

  5. 设置SecureCRT的背景色和文字颜色方案

    一.对于临时设置,可以如下操作: 首先options -- session - appearance 此处可以设置临时的窗口背景,字体颜色,大小等等,为什么说是临时,是因为只要你关闭连接后,又会恢复. ...

  6. secureCRT颜色方案设置

    按照如下设置后vim编辑会有如下颜色提示

  7. shell 通过ANSI转换颜色

    格式: echo -e "\033[字背景颜色;字体颜色m字符串\033[控制码" 如果单纯显示字体颜色可以固定控制码位0m. 格式: echo -e "\033[字背景 ...

  8. C# winforms 输入颜色转换颜色名

    本文告诉大家如何输入颜色,如0xFFFF8000转换为 Orange 在 winforms 程序 可以使用下面代码转换 public static class HexColorTranslator { ...

  9. Tkinter颜色方案举例

    效果图: 示例代码: # _*_ coding: utf-8 _*_ from Tkinter import * colors = '''#FFB6C1 LightPink 浅粉红 ,#FFC0CB ...

随机推荐

  1. thinkPHP5中的与原本的字母方法用什么东西替代了?

    过去的单字母函数已完全被替换掉,如下:S=>cache,C=>config,M/D=>model,U=>url,I=>input,E=>exception,L=&g ...

  2. POJ1904 强联通(最大匹配可能性)

    题意:       有n个王子,n个公主,然后给你每个王子喜欢的公主,最后问你在不影响最大匹配的前提下,每个王子可以匹配那些公主. 思路:       是hdu4685的减弱版,之前研究过hdu468 ...

  3. LA3602DNA序列

    题意:      给你一个一些DNA序列(只有ACGT)然后让你构造一个序列,使得所有的序列到他的Hamming距离最小,所有的序列包括构造的序列长度都是N,Hamming表示两个序列的不同字符位置个 ...

  4. UVA11991第k次出现的v的下标

    题意:      给你一个有n个数的数字序列,然后有m组询问,每组询问是问第k次出现的v在序列里的小标是多少? 思路:      简单题目,直接开个二维的容器就行了,标记出现次数可以开个数组或者是一维 ...

  5. Node-Web模块

    创建服务端------------------------------------------------------ var http = require('http'); var fs = req ...

  6. 【原创】JVM如何运行Java程序的?

    [Deerhang] 我们知道Java程序的运行是依赖于JVM虚拟机的,JVM类语言经过编译生成class字节码文件,字节码又经JVM进一步的编译生成机器码,最终运行在硬件上.那么JVM存在的意义是什 ...

  7. Python中的pip安装与使用

    配置python的环境变量 我们在我的电脑右击->属性->高级系统设置看到环境变量 然后我们点击环境变量,找到系统变量中的Path变量然后双击他新建一项,值为我们安装的python的pyt ...

  8. 一文解决MySQL时区相关问题

    前言: 在使用MySQL的过程中,你可能会遇到时区相关问题,比如说时间显示错误.时区不是东八区.程序取得的时间和数据库存储的时间不一致等等问题.其实,这些问题都与数据库时区设置有关,本篇文章将从数据库 ...

  9. Pytorch_Part2_数据模块

    VisualPytorch beta发布了! 功能概述:通过可视化拖拽网络层方式搭建模型,可选择不同数据集.损失函数.优化器生成可运行pytorch代码 扩展功能:1. 模型搭建支持模块的嵌套:2. ...

  10. 成功的多项目管理都有哪些"制胜之道"?

    实施多项目管理,一个重要原因就是提高项目的效率和管理水平.除了满足时间.成本.业绩和客户需求之外,项目管理办公室(PMO)经理的预期产出还包括有效利用组织资源.下面是影响多项目管理成功的几个关键因素, ...