传感器与拜耳阵列:CMOS 如何“看见”颜色

好,我们正式开始第二讲。上一章聊了 RAW 是什么,这一章我们深入传感器内部,看看 RAW 数据到底是怎么来的。

你想想看,相机传感器本质上就是个光子计数器。它只能感知光的强弱,也就是亮度。那颜色从哪来?

答案就是——拜耳阵列。这是整个计算摄影的起点,也是我工作中打交道最多的东西之一。

CMOS 传感器工作原理

CMOS 传感器,说白了就是一个巨大的像素阵列。每个像素就是一个光电二极管,光子打上去产生电子,电子数量正比于光强。

但这里有个关键问题:单个像素只能记录亮度,分不清红绿蓝。就像黑白胶卷一样。

那怎么办?

工程师们想了个办法:在每个像素前面盖一层微小的滤色片,只允许特定波长的光通过。这就是拜耳阵列的由来。

核心概念:CMOS 传感器 = 光电二极管阵列 + 微透镜 + 彩色滤色片阵列 (CFA)。其中 CFA 最常见的模式就是拜耳阵列。

拜耳阵列:RGGB 的色彩滤波逻辑

拜耳阵列的经典模式是 RGGB。为什么绿色通道有两个像素?

因为人眼对绿色最敏感。多采样绿色,能更好地模拟人眼视觉特性。我在做早期手机相机调试时,发现绿色通道的噪声直接影响整体画质,就是这个原因。

拜耳阵列的排列逻辑如下:

行 列 0 列 1 列 2 列 3
行 0 R G R G
行 1 G B G B
行 2 R G R G
行 3 G B G B

每个 2x2 单元包含:1 个红色、2 个绿色、1 个蓝色。这就是 RGGB 的由来。

但注意,这只是最经典的排列。实际还有 RCCC、RCCB 等变体,用于特殊场景。不过我们课程主要围绕 RGGB 展开。

个人经验:我曾经在调试一款安防摄像头时,发现暗光下绿色通道偏紫。排查了半天,结果是拜耳阵列的绿色滤色片镀膜厚度偏差。嗯,这种坑只有踩过才知道。

去马赛克(Demosaicing)的初步概念

好,现在传感器输出的是拜耳阵列数据。每个像素只有一个颜色值。但我们最终要的是每个像素都有 R、G、B 三个值。

这个过程就叫去马赛克,也叫 Demosaicing。

说白了,就是通过插值算法,把缺失的颜色猜出来。

比如一个红色像素,它缺少绿色和蓝色。我们就用周围相邻的绿色和蓝色像素来估算。

最简单的算法是双线性插值:

// 伪代码:双线性插值去马赛克
// 对于红色像素 (r, c),估算 G 值
G_est = (G[r-1][c] + G[r+1][c] + G[r][c-1] + G[r][c+1]) / 4

// 估算 B 值
B_est = (B[r-1][c-1] + B[r-1][c+1] + B[r+1][c-1] + B[r+1][c+1]) / 4

但这种方法有个问题:边缘处会产生伪影,比如彩色锯齿。我早期做算法时,双线性插值出来的图像,边缘全是彩虹色,惨不忍睹。

所以后来有了更高级的算法:

  • 边缘导向插值:先检测边缘方向,再沿边缘方向插值,减少伪影。
  • 自适应插值:根据局部纹理复杂度,动态选择插值策略。
  • 基于深度学习的去马赛克:用 CNN 直接端到端恢复全彩图像,效果最好,但计算量大。

避坑指南:我曾经在低功耗设备上尝试用深度学习去马赛克,结果功耗直接飙到 2W,电池撑不住。后来还是切回了自适应插值。算法再好,也要考虑硬件限制。

本章知识体系

下面这张图总结了传感器到去马赛克的完整流程:

传感器到去马赛克流程 入射光 微透镜阵列 拜耳阵列 (RGGB) 光电转换 RAW 数据输出 去马赛克 (Demosaicing) 全彩图像 关键说明 • 拜耳阵列是 CFA 中最常见的模式,RGGB 占比约 90% • 去马赛克是 RAW 到 RGB 的第一步,直接影响画质 • 算法选择需权衡:质量 vs 速度 vs 功耗 • 边缘伪影是去马赛克的主要挑战

去马赛克算法的对比

不同算法各有优劣,我整理了一个对比表:

算法类型 质量 速度 功耗 适用场景
双线性插值 低 极快 极低 预览、低端设备
边缘导向插值 中 快 低 主流手机、相机
自适应插值 高 中等 中等 高端相机、专业应用
深度学习去马赛克 极高 慢 高 后期处理、云端

我的建议:如果你刚开始接触计算摄影,先从边缘导向插值入手。它比双线性好得多,又不像深度学习那样需要 GPU。我在做第一个手机相机项目时,就是用边缘导向插值,效果已经能打 80 分了。

本章小结

这一章我们覆盖了三个核心知识点:

  • CMOS 传感器:光子计数器,只能感知亮度,需要 CFA 才能获取颜色。
  • 拜耳阵列 RGGB:最经典的 CFA 模式,绿色双倍采样模拟人眼特性。
  • 去马赛克:从单通道 RAW 恢复全彩图像的过程,算法选择决定画质上限。