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的优势总结为三点:

  1. 功耗低——单电源供电,静态功耗几乎为零
  2. 速度快——可以做到上千帧每秒的高速采集
  3. 集成度高——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 噪声测量方法

怎么测噪声?我常用的方法:

  1. 暗场测量:盖上镜头盖,拍100帧,计算每个像素的均值和标准差
  2. 亮场测量:用均匀光源照射,拍不同曝光时间的图像
  3. 光子转移曲线:绘制信号均值 vs 方差曲线,斜率就是增益

光子转移曲线这个方法特别实用。你想想看,通过一条曲线就能读出传感器的增益、满阱容量、读出噪声,比看datasheet靠谱多了。

2.4 本章知识体系

下面这张图是我自己整理的传感器知识框架,你可以对照着复习:

图像传感器基础 CCD vs CMOS • CCD:电荷耦合,一致性高 • CMOS:像素级放大,集成度高 • 选型:看场景,没有绝对好坏 Bayer阵列与CFA • RGGB:绿色占50% • 变种:RGBW、RCCC、Quad • 欠采样本质,需Demosaic 传感器噪声模型 • FPN:固定模式噪声 • 随机噪声:散粒/读出/暗电流 • 光子转移曲线测量法 核心:理解传感器是ISP调试的起点 不懂传感器,调参就是盲人摸象

这张图把本章的三个核心知识点串起来了。你仔细看,CCD/CMOS讲的是怎么采集,Bayer阵列讲的是怎么分色,噪声模型讲的是有什么干扰。三者缺一不可。

最后说一句:我见过太多工程师,一上来就调AWB、调降噪,结果发现传感器本身就有问题——暗电流太大、FPN不均匀、增益标定不准。所以我的习惯是:拿到新传感器,先花两天时间把噪声模型摸清楚。这步省不了,省了后面要花更多时间填坑。


公众号:蓝海资料掘金营,微信deep3321