2、图像传感器基础:CCD与CMOS传感器原理、Bayer阵列与色彩滤波、传感器噪声模型
做ISP这么多年,我始终觉得一个道理颠扑不破——不懂传感器,就别谈图像调试。你连原始数据怎么来的都不清楚,后面调再多的参数也是瞎蒙。今天咱们就把传感器这块硬骨头啃下来。
2.1 CCD与CMOS:两种主流传感器的恩怨情仇
先说个有意思的事。我刚入行那会儿,CCD还是高端相机的标配,CMOS被大家嫌弃得不行。现在呢?手机、监控、车载,清一色CMOS。为什么会这样?说白了就是工艺和需求的博弈。
2.1.1 CCD传感器原理
CCD的全称是电荷耦合器件。它的工作流程很特别:
- 每个像素收集光子,转化成电荷
- 电荷在像素间像水桶接力一样逐行传递
- 最后统一送到一个输出放大器转换成电压
我打个比方你就明白了。CCD就像一条流水线,每个工位只负责把零件传给下一个,最后一个人统一质检。这种架构的好处是:
- 一致性极好——所有像素共用同一个放大器,没有像素间的增益差异
- 暗电流低——工艺成熟,噪声控制优秀
- 动态范围大——满阱电荷量通常比CMOS大
但缺点也很致命:
- 功耗高——需要多路高压时钟驱动
- 速度慢——逐行读出,帧率上不去
- 集成度低——没法把ADC、逻辑电路做在同一个芯片上
关键点:CCD的读出方式是"全局快门"的天然实现。所有像素同时曝光,然后逐行转移。这在高速拍摄场景下优势明显,不会出现果冻效应。
2.1.2 CMOS传感器原理
CMOS就完全是另一套思路了。每个像素自带一个放大器,甚至有的还集成了ADC。你可以想象成每个工位都有自己的质检员,干完活直接报结果。
CMOS的读出方式有两种:
- 滚动快门:逐行曝光、逐行读出。成本低,但拍快速运动的物体会变形
- 全局快门:所有像素同时曝光,然后逐行读出。需要额外的存储单元,像素面积大
我个人习惯把CMOS的优势总结为三点:
- 功耗低——单电源供电,静态功耗几乎为零
- 速度快——可以做到上千帧每秒的高速采集
- 集成度高——ISP、DDR、MIPI接口全都能塞进一颗芯片
避坑指南:我曾经在一个项目中选了某款CMOS传感器,标称动态范围70dB。结果实际测试发现,高光区经常过曝,暗部又全是噪点。后来仔细看datasheet才发现,那个70dB是"设计值",实际可用动态范围只有55dB左右。所以啊,永远不要全信datasheet上的数字,拿到样片先自己测一遍。
2.1.3 CCD vs CMOS:怎么选?
| 维度 | CCD | CMOS |
|---|---|---|
| 读出噪声 | 低(2-3e-) | 较高(3-10e-) |
| 暗电流 | 极低 | 较高(随温度指数上升) |
| 帧率 | 慢(通常≤30fps) | 快(可达1000+fps) |
| 功耗 | 高(500mW+) | 低(100mW左右) |
| 成本 | 高 | 低 |
| 应用场景 | 天文、医疗、科研 | 手机、安防、车载、工业 |
你想想看,现在手机摄像头模组才几块钱成本,用CCD根本不可能。但如果你在做天文相机,一颗CCD卖几万块也正常。没有绝对的好坏,只有合不合适的场景。
2.2 Bayer阵列与色彩滤波:单芯片如何拍出彩色?
传感器本身只能感知光的强度,分不清颜色。那彩色照片怎么来的?答案就是Bayer阵列。
2.2.1 Bayer阵列的原理
Bayer阵列是在每个像素上覆盖一层微小的滤色片,只允许特定波长的光通过。最常见的模式是RGGB:
- 50%绿色像素(人眼对绿色最敏感)
- 25%红色像素
- 25%蓝色像素
为什么绿色占一半?因为人眼的亮度感知主要来自绿色通道。你想想看,如果红色和蓝色占一样多,拍出来的照片亮度分辨率会下降很多。
核心概念:Bayer阵列的本质是欠采样。每个像素只记录一种颜色,另外两种颜色需要通过插值算法(Demosaic)补全。这就是为什么原始RAW数据看起来是马赛克状的。
2.2.2 其他色彩滤波阵列
除了标准的Bayer,还有一些变种:
- RGBW:加入白色像素,提升低光灵敏度。我在做安防摄像头时用过,暗光下信噪比能提升3-5dB
- RCCC:用于自动驾驶,红色通道增强,对刹车灯更敏感
- Quad Bayer:四个同色像素组成一组,可以binning成低分辨率高灵敏度模式
经验之谈:我建议你在做ISP调试时,先搞清楚传感器用的是哪种CFA模式。有一次我接手一个项目,调了三天Demosaic总觉得颜色不对,最后才发现传感器用的是RGBW,而我用的标准Bayer算法。白白浪费三天时间。
2.2.3 色彩滤波的光学影响
滤色片不是完美的。每个通道的光谱响应曲线都有重叠,这会导致:
- 串扰——红色像素可能感应到少量绿光
- 灵敏度损失——滤色片会阻挡约60-70%的入射光
- 角度响应——大角度入射光会导致颜色偏移(Lens Shading的一种)
这些都需要在ISP的AWB和CCM模块中做补偿。嗯,后面章节会详细讲。
2.3 传感器噪声模型:图像质量的隐形杀手
做ISP调试,说白了就是在跟噪声做斗争。你调降噪参数调得再好,如果不理解噪声的来源和特性,那就是瞎调。
2.3.1 噪声的分类与来源
我把传感器噪声分成两大类:
1. 固定模式噪声(FPN)
- 像素间增益不一致(PRNU)
- 像素间暗电流不一致(DSNU)
- 列放大器偏移不一致
2. 随机噪声
- 光子散粒噪声(服从泊松分布)
- 读出噪声(包括复位噪声、放大器噪声)
- 暗电流散粒噪声
- 量化噪声
重要公式:总噪声的方差 = 光子散粒噪声方差 + 读出噪声方差 + 暗电流噪声方差
其中光子散粒噪声的方差等于信号强度本身(泊松分布的特性)。这意味着信号越强,绝对噪声越大,但信噪比反而越高。
2.3.2 噪声模型的实际应用
我在项目中常用的噪声模型是这样的:
// 简化的传感器噪声模型
// n_total = sqrt( k1 * signal + k2 * signal^2 + k3 )
// k1: 散粒噪声系数
// k2: PRNU系数(与信号平方成正比)
// k3: 读出噪声方差(常数)
float estimate_noise(float signal, float k1, float k2, float k3) {
float shot_noise = k1 * signal;
float prnu_noise = k2 * signal * signal;
float read_noise = k3;
return sqrt(shot_noise + prnu_noise + read_noise);
}
这个模型有什么用?举个例子:
- 做降噪时,可以根据信号强度自适应调整滤波强度
- 做3A(AE/AWB/AF)时,可以预测不同亮度下的信噪比
- 做传感器选型时,可以对比不同传感器的噪声特性
注意:这个模型是简化版。实际传感器的噪声特性更复杂,比如:
- 温度对暗电流的影响是指数级的(每升高6-8°C,暗电流翻倍)
- 列噪声和行噪声是相关的,不是独立的高斯噪声
- ADC的量化噪声在低信号区不可忽略
我建议你在实际项目中,先采集一组暗场和亮场数据,拟合出真实的噪声参数,而不是直接用datasheet上的理论值。
2.3.3 噪声测量方法
怎么测噪声?我常用的方法:
- 暗场测量:盖上镜头盖,拍100帧,计算每个像素的均值和标准差
- 亮场测量:用均匀光源照射,拍不同曝光时间的图像
- 光子转移曲线:绘制信号均值 vs 方差曲线,斜率就是增益
光子转移曲线这个方法特别实用。你想想看,通过一条曲线就能读出传感器的增益、满阱容量、读出噪声,比看datasheet靠谱多了。
2.4 本章知识体系
下面这张图是我自己整理的传感器知识框架,你可以对照着复习:
这张图把本章的三个核心知识点串起来了。你仔细看,CCD/CMOS讲的是怎么采集,Bayer阵列讲的是怎么分色,噪声模型讲的是有什么干扰。三者缺一不可。
最后说一句:我见过太多工程师,一上来就调AWB、调降噪,结果发现传感器本身就有问题——暗电流太大、FPN不均匀、增益标定不准。所以我的习惯是:拿到新传感器,先花两天时间把噪声模型摸清楚。这步省不了,省了后面要花更多时间填坑。
公众号:蓝海资料掘金营,微信deep3321