在OpenCV中使用Bayer格式

如题所述

第1个回答  2022-07-21
bayer格式图片是伊士曼·柯达公司科学家Bryce Bayer发明的,他所发明的拜耳阵列被广泛运用数字图像。对于彩色图像,需要采集多种最基本的颜色,如rgb三种颜色,最简单的方法就是用滤镜的方法,红色的滤镜透过红色的波长,绿色的滤镜透过绿色的波长,蓝色的滤镜透过蓝色的波长。如果要采集rgb三个基本色,则需要三块滤镜,这样价格昂贵,且不好制造,因为三块滤镜都必须保证每一个像素点都对齐。当用bayer格式的时候,很好的解决了这个问题。bayer 格式图片在一块滤镜上设置的不同的颜色,通过分析人眼对颜色的感知发现,人眼对绿色比较敏感,所以一般bayer格式的图片绿色格式的像素是是r和g像素的和。另外,Bayer格式是相机内部的原始图片, 一般后缀名为.raw。很多软件都可以查看, 比如PS。我们相机拍照下来存储在存储卡上的.jpeg或其它格式的图片, 都是从.raw格式转化过来的。如下图,为bayer色彩滤波阵列,由1/2的G,1/4的R,1/4的B组成,因而总占用空间为rgb的1/3。

总体来说,Bayer的总体格式是这样的:

对每个点来说,要还原为rgb格式的话,需要从周围提取其它种类的点。如选择G点,需要从周围取2个B点和2个R点,选择B点,则需从周围取4个G点和2个R点。
但是Bayer没有规定图片格式究竟以哪个点开始,但是做为解析的程序必须明确起始点是如何排列的。从总体格式图中截取4个像素,如下:

这个叫BGGR排列,类似的,其他的三种排列为:

无论哪种排列,可以总结为:
如果偶数行(以0开始)为 BGBGBG......,则奇数行为GRGRGR......,即像素总是交错排列,其他格式以此类推。

在OpenCV中,对以上这4种排列,取排列名称的后两位字母倒着读,OpenCV定义为4种格式,分别为:
BGGR排列 -> BG格式
RGGB排列 -> RG格式
GRBG排列 -> GB格式
GBRG排列 -> GR格式

可惜的是,OpenCV没有提供从BGR生成Bayer格式的接口,需要自己写,好在BGR到Bayer属于下采样过程,过程也不复杂,下面是我实现的BGR转BayerGB(GRBG排列)的算法:

其他的格式可以照着写。

最后说明下:
从BGR到Bayer,再到BGR,这两步互转是有颜色损失的。首先,从BGR到Bayer的转换,相当于一个下采样的过程,空间压缩了3倍,信息损失了2/3。其次,从Bayer到BGR的转换,相当于一个上采样的过程,空间扩大了3倍,需要插值填充信息,通常的插值方法是采用取周围像素求平均值的方法。此外,若像素采用整数格式,求平均值时四舍五入也会带来一部分颜色损失。这一下一上两个采样过程,肯定是要丢失颜色信息的。