图像传感器基础:Bayer阵列原理、CFA模式、光子到电信号的转换过程

做去马赛克和降噪,绕不开图像传感器。说白了,你得先知道照片是怎么来的,才能知道怎么修它。

我刚开始接触ISP(图像信号处理)时,总觉得Bayer阵列就是个简单的滤镜排列。后来在项目中调试一块CMOS传感器,发现暗光下全是彩色条纹,才意识到——嗯,这东西远比我想象的复杂。

从光子到电子:传感器的工作起点

一张数字照片的起点,是光子。光打到传感器上,被光电二极管吸收,产生电子。这个过程叫光电转换。

关键公式其实很简单:

光生电子数 = 量子效率 × 入射光子数

量子效率(QE)是传感器的核心指标。我见过一些低端传感器,QE只有30%左右,暗光下基本没法看。好的背照式(BSI)传感器能做到70%以上。

核心概念:每个像素点只能感知光的强度,不能感知颜色。颜色信息全靠后面的滤色片来区分。

CFA模式:为什么是Bayer?

人眼对绿色最敏感。Bayer阵列正是利用了这一点——绿色像素占一半,红色和蓝色各占四分之一。

颜色通道 占比 原因
绿色 (G) 50% 人眼亮度感知峰值在550nm(绿光)
红色 (R) 25% 长波信息,肤色、夕阳等
蓝色 (B) 25% 短波信息,天空、水体等

为什么不是RGB各占三分之一?我刚开始也这么想。后来做了一次实验:把Bayer改成均匀分布,结果绿色区域的细节全糊了。人眼对亮度细节敏感,而绿色贡献了大部分亮度信息。所以Bayer这个设计,其实是跟人眼走的。

Bayer阵列的排列方式

最常见的排列是RGGB。但注意,不同厂商有不同变种:

  • RGGB:索尼、三星主流方案
  • BGGR:部分OmniVision传感器
  • GRBG:某些老款CCD

排列顺序会影响去马赛克算法的插值方向。我在项目中遇到过一个问题:用标准算法处理BGGR排列的图像,结果边缘全是锯齿。后来才发现是Bayer顺序没对齐。

避坑指南:我曾经因为Bayer顺序搞错,整整浪费了两天调试时间。拿到原始RAW数据后,第一件事就是确认Bayer排列。用纯色卡拍一张,看插值后的颜色是否正确。

Bayer阵列的结构图

下面这张图展示了2×2 Bayer单元在传感器上的重复排列方式:

Bayer阵列 2×2 单元重复结构 R G R G G B G B R G R G G B G B 2×2 基本单元 Bayer阵列特点 • 绿色占50% • 红色占25% • 蓝色占25% • 重复2×2单元

光子到电信号的完整流程

你想想看,一个像素从接收光子到输出数字值,中间经历了什么?

  1. 光子入射:光通过微透镜汇聚到光电二极管
  2. 光电转换:光子被吸收,产生电子-空穴对
  3. 电荷积累:电子在势阱中积累,曝光时间越长,电子越多
  4. 电荷读出:通过行选择、列选择电路,逐行读出电荷量
  5. 模数转换:电荷量转换为数字值(ADC)
  6. RAW输出:得到Bayer格式的原始数据

个人经验:我习惯在调试时先看RAW数据的直方图。如果某个通道的直方图被截断,说明曝光或增益设置有问题。别急着调算法,先确认传感器输出是干净的。

噪声从哪里来?

传感器不是完美的。每个环节都会引入噪声。我整理了一下常见的噪声源:

噪声类型 来源 特点
散粒噪声 光子到达的随机性 与信号强度平方根成正比
读出噪声 电荷读出电路 与信号无关,固定水平
暗电流噪声 热激发产生的电子 随温度升高而增加
固定模式噪声 像素间工艺差异 空间固定,可校准

为什么要讲这些?因为去马赛克和降噪算法,本质上就是在跟这些噪声做斗争。你连对手都不认识,怎么打?

Bayer数据与全彩图像的差距

每个像素只有一个颜色值。要得到全彩图像,必须通过去马赛克算法插值出缺失的两个通道。这就是我们后面几章要重点讲的内容。

举个例子:一个红色像素位置,只有R值。G和B值需要从周围像素插值得到。插值做不好,就会出现伪彩色、锯齿、模糊。

关键认知:Bayer数据不是图像,是原始测量值。去马赛克不是简单的放大,而是从稀疏采样中重建完整颜色信息。这个重建过程的质量,直接决定了最终图像的分辨率和色彩准确度。

小结

这一章我们聊了传感器的基础:从光子到电信号,Bayer阵列为什么是那个样子,以及噪声从哪里来。我个人觉得,理解这些底层原理,比直接调算法参数重要得多。你想想看,如果你不知道Bayer排列顺序,连RAW数据都解析不对,后面再好的算法也是白搭。