Bayer滤镜转换颜色方案
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滤镜转换颜色方案的更多相关文章
- 2018-9-30-C#-winforms-输入颜色转换颜色名
title author date CreateTime categories C# winforms 输入颜色转换颜色名 lindexi 2018-09-30 18:27:49 +0800 2018 ...
- Ubuntu终端字体颜色方案
默认: 蓝色代表该文件夹: 绿色代表可运行文件. 红色表示压缩文件. 浅蓝色表示链接文件: 灰色表示其它文件: 红色闪烁表示链接的文件有问题了 黄色表示设备文件. 非常不爽怎么办,改! # Attri ...
- 设置vim颜色方案
获取所有vim颜色配置方案 ls /usr/share/vim/vim74/colors/ [root@lx ~]# ls /usr/share/vim/vim74/colors/ blue.vim ...
- css过滤镜实现颜色渐变
语法:filter : progid:DXImageTransform.Microsoft.Gradient ( enabled=bEnabled , startColorStr=iWidth , e ...
- 设置SecureCRT的背景色和文字颜色方案
一.对于临时设置,可以如下操作: 首先options -- session - appearance 此处可以设置临时的窗口背景,字体颜色,大小等等,为什么说是临时,是因为只要你关闭连接后,又会恢复. ...
- secureCRT颜色方案设置
按照如下设置后vim编辑会有如下颜色提示
- shell 通过ANSI转换颜色
格式: echo -e "\033[字背景颜色;字体颜色m字符串\033[控制码" 如果单纯显示字体颜色可以固定控制码位0m. 格式: echo -e "\033[字背景 ...
- C# winforms 输入颜色转换颜色名
本文告诉大家如何输入颜色,如0xFFFF8000转换为 Orange 在 winforms 程序 可以使用下面代码转换 public static class HexColorTranslator { ...
- Tkinter颜色方案举例
效果图: 示例代码: # _*_ coding: utf-8 _*_ from Tkinter import * colors = '''#FFB6C1 LightPink 浅粉红 ,#FFC0CB ...
随机推荐
- php变量的命名规则
php变量的命名规则 1.变量以美元符号$开头.如$name,$age: 2.美元符号$后面的第一个字符不可以是数字: 3.除了下划线_外,变量不允许出现任何空格或者标点符号: 4.PHP变量名是区分 ...
- table边框完全去掉的方法
表格中边框的显示 只显示上边框 <table frame=above> 只显示下边框 <table frame=below> 只显示左.右边框 <table frame= ...
- hdu4370 比较抽象的最短路
题意: 给你一个n*n的矩阵,然后让咱们构造另一个n*n的矩阵,构造的矩阵有如下要求, 1.X12+X13+...X1n=1. 2.X1n+X2n+...Xn-1n=1. 3.for ea ...
- PHP Tips
开启x_debug,使用var_dump()的显示效果会更好,同时错误也很更详细.
- ElasticSearch7.10.0入门学习
ElasticSearch完成最关键的一个功能就是 大数据搜索 官网:https://www.elastic.co/cn/elasticsearch/ 简介 Elasticsearch 是一个分布式全 ...
- pysmiles:一个用于读写SMILES表达式的python库
技术背景 SMILES表达式是化学里面常用的用于标定元素之间关系的字符串,旨在用最简短的语句来完整的表达一个分子体系内所蕴含的基本信息,比如元素.连接性以及连接属性等.由于SMILES表达式的定义种类 ...
- 17道APP测试面试题分享带参考答案
一.Android四大组件 Android四大基本组件:Activity.BroadcastReceiver广播接收器.ContentProvider内容提供者.Service服务. Activity ...
- python爬虫——抖音数据
最近挺火的抖音短视频,不仅带火了一众主播,连不少做电商的也进驻其中,于是今天我来扒一扒这火的不要不要的抖音数据: 一.抓包工具获取用户ID 对于手机app数据,抓包是最直接也是最常见的手段,常用的抓包 ...
- OOP第一章总结
经过了三周的OO,尽管过程不太轻松,但是有所得还是值得欣慰的事! (1)程序结构 第一次作业: UML类图如下,第一次作业在结构上并没有太多面向对象的思想,只是简单的分类,一个运行类,两个对象类,预处 ...
- 7. IDEA概述和安装
1.1IDEA概述 IDEA全称InteliJ IDEA,是用于Java语言开发的继承环境,它是业界公认的目前用于Java程序开发的最好工具 集成环境:把代码编写,编译,执行,调试等多种功能综合到一起 ...