4.11. 去拜耳化

原始拜耳帧的每个像素只携带一个颜色通道。要把它转换成普通的三通道 RGB 图像,就需要在每个像素处通过对附近正确颜色的像素进行插值来补全缺失的两个通道。这种插值过程就是 去拜耳化(debayering,也称去马赛克 demosaicing)。主流的算法可归为少数几大类。

4.11.1. 超像素

最廉价的方法是把每个 2x2 拜耳块——一个红色单元、一个蓝色单元和两个绿色单元——合并成单个输出像素:

  • 红色通道取红色单元的值;

  • 蓝色通道取蓝色单元的值;

  • 绿色通道取两个绿色单元的平均值。

每个 2x2 输入块变成一个输出像素,因此成品图像的宽度和高度都是传感器的一半,像素数量只有四分之一。超像素法速度快,且不会产生插值伪影,但分辨率的代价使其成为最后的选择——它很少被使用。

4.11.2. 双线性

双线性(bilinear)插值是对正确颜色的最近邻像素求平均,而不是复制或汇总。具体的平均方式取决于中心像素记录的是哪种颜色,因为四种情况在 3x3 邻域中分布缺失通道的方式各不相同。

红绿行中的绿色像素。 缺失的红色值取左右两个红色邻居的平均值;缺失的蓝色值取上下两个蓝色邻居的平均值。

一个 3 列 3 行的拜耳模式邻域, 以红绿行中的某个绿色像素为中心。中心 左右的单元为红色;上下的单元为蓝色; 角上的单元为绿色。白色箭头从两个红色 单元和两个蓝色单元向内指向中心。

缺失的红色来自水平方向的红色邻居;缺失的蓝色来自垂直方向的蓝色邻居。

绿蓝行中的绿色像素。 形状相同,但红蓝互换。缺失的红色值取上下两个红色邻居的平均值;缺失的蓝色值取左右两个蓝色邻居的平均值。

一个 3 列 3 行的拜耳模式邻域, 以绿蓝行中的某个绿色像素为中心。中心 上下的单元为红色;左右的单元为蓝色;角上 的单元为绿色。白色箭头从两个红色单元 和两个蓝色单元向内指向 中心。

缺失的红色来自垂直方向的红色邻居;缺失的蓝色来自水平方向的蓝色邻居。

红色像素。 缺失的绿色值取四个正交方向(上、下、左、右)绿色邻居的平均值。缺失的蓝色值取四个对角方向蓝色邻居的平均值。

一个 3 列 3 行的拜耳模式邻域, 以某个红色像素为中心。四个正交 邻居(上、下、左、右)为绿色; 四个对角的角单元为蓝色。白色 箭头从全部八个邻居向内 指向中心。

缺失的绿色来自四个正交方向的绿色邻居;缺失的蓝色来自四个对角方向的蓝色邻居。

蓝色像素。 与红色情况镜像对称。缺失的绿色值取四个正交方向绿色邻居的平均值,缺失的红色值取四个对角方向红色邻居的平均值。

一个 3 列 3 行的拜耳模式邻域, 以某个蓝色像素为中心。四个正交 邻居为绿色;四个对角的角 单元为红色。白色箭头从全部 八个邻居向内指向中心。

缺失的绿色来自四个正交方向的绿色邻居;缺失的红色来自四个对角方向的红色邻居。

双线性法保留了传感器的完整分辨率,对大多数用途而言足够平滑,但它在边缘处仍会出现伪影。两种颜色之间的锐利过渡会以特定方向穿过像素网格,而跨边缘求平均会使其略微变软。在颜色边缘和亮度边缘没有精确对齐的地方,输出中会出现淡淡的彩色条纹。

4.11.3. 超越双线性

存在一系列更优的去拜耳算法。有些算法使用比双线性那种由同色邻居组成的小十字更大的邻域,并以更精心选取的系数对采样加权;另一些算法则检测局部边缘的方向,使插值沿该方向偏置,从而让横穿像素网格的边缘保持锐利而不变软。这两种思路都能减少双线性遗留的彩色条纹和边缘软化,代价是每个像素需要更多运算、更多硅片面积(或在 MCU 端需要更多算力)。

任何一台具体的 OpenMV Cam 上可用的去拜耳质量都是平台相关的——它取决于该摄像头上的传感器和 MCU 能提供什么。

4.11.4. 去拜耳化在何处运行

图像信号处理器(ISP)——位于传感器芯片本身或 MCU 端——在大多数情况下会在每一帧离开成像流水线之前对其进行去拜耳化。用户代码接收到的是成品三通道 RGB 图像,完全无需接触原始马赛克。

也可以让 ISP 原样透传原始拜耳帧。原始拜耳比去拜耳后的图像占用更少内存——每像素一个字节而非三个字节——这使其在帧存储成为瓶颈时、在为离线处理而采集时、或在项目希望以软件应用自定义去拜耳算法时非常有用。