传感器与拜耳阵列: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,电池撑不住。后来还是切回了自适应插值。算法再好,也要考虑硬件限制。
本章知识体系
下面这张图总结了传感器到去马赛克的完整流程:
去马赛克算法的对比
不同算法各有优劣,我整理了一个对比表:
| 算法类型 | 质量 | 速度 | 功耗 | 适用场景 |
|---|---|---|---|---|
| 双线性插值 | 低 | 极快 | 极低 | 预览、低端设备 |
| 边缘导向插值 | 中 | 快 | 低 | 主流手机、相机 |
| 自适应插值 | 高 | 中等 | 中等 | 高端相机、专业应用 |
| 深度学习去马赛克 | 极高 | 慢 | 高 | 后期处理、云端 |
我的建议:如果你刚开始接触计算摄影,先从边缘导向插值入手。它比双线性好得多,又不像深度学习那样需要 GPU。我在做第一个手机相机项目时,就是用边缘导向插值,效果已经能打 80 分了。
本章小结
这一章我们覆盖了三个核心知识点:
- CMOS 传感器:光子计数器,只能感知亮度,需要 CFA 才能获取颜色。
- 拜耳阵列 RGGB:最经典的 CFA 模式,绿色双倍采样模拟人眼特性。
- 去马赛克:从单通道 RAW 恢复全彩图像的过程,算法选择决定画质上限。