2、成像基础:CMOS传感器工作原理、曝光时间与ISO对图像质量的影响、暗电流与热噪声
做低光照增强,绕不开成像的源头——传感器。你想想看,如果连传感器怎么工作的都不清楚,后面做算法优化就像蒙着眼睛修车。这一节,我带你从CMOS传感器的工作原理讲起,再聊聊曝光时间、ISO这些直接影响图像质量的参数,最后说说暗电流和热噪声这两个“暗处捣乱的家伙”。
2.1 CMOS传感器工作原理
CMOS传感器,说白了就是一个像素阵列。每个像素就是一个光电二极管,外加一个放大器。光打到二极管上,产生电子,电子数量跟光强成正比。然后放大器把电荷转成电压,再通过模数转换器(ADC)变成数字信号。
我个人习惯把CMOS的工作流程拆成三步:
- 光电转换:光子撞击硅基,产生电子-空穴对。
- 电荷积累:电子在像素的势阱里累积,曝光时间越长,积累越多。
- 读出与放大:逐行扫描读出,每个像素的电压被放大并量化。
我在项目中遇到过一个问题:同一款传感器,不同批次拍出来的暗部细节差异很大。后来发现是像素放大器的增益一致性出了问题。嗯,这里要注意——CMOS的每个像素都有自己的放大器,一致性天生不如CCD。这也是为什么低光照下CMOS容易出现“固定模式噪声”。
关键点:CMOS的读出方式是逐行滚动快门(Rolling Shutter),不是全局快门(Global Shutter)。这意味着同一帧里,不同行的曝光起始时间不同。如果你在拍快速运动的物体,比如飞驰的汽车,画面会出现“果冻效应”——物体变形了。低光照下,曝光时间拉长,这个效应会更明显。
下面这张图展示了CMOS传感器的核心工作流程:
2.2 曝光时间与ISO对图像质量的影响
曝光时间和ISO,是低光照拍摄时最常调的两个参数。但很多人只知其然,不知其所以然。我刚开始做图像处理时,也踩过坑——为了拍暗处细节,把ISO拉到很高,结果画面全是噪点,还不如不拍。
2.2.1 曝光时间
曝光时间,就是传感器收集光子的时间窗口。时间越长,收集的光子越多,信号越强。但代价也很明显:
- 运动模糊:手持拍摄时,手抖会让画面变糊。我建议曝光时间不要超过1/30秒,除非你用了三脚架。
- 果冻效应加剧:滚动快门下,长曝光会让运动物体变形更严重。
- 暗电流积累:曝光时间越长,暗电流产生的噪声越多(后面会细讲)。
实战技巧:在低光照场景下,我一般先固定曝光时间(比如1/30秒),然后调整光圈和ISO。如果光圈已经最大了,再考虑拉长曝光时间。记住——曝光时间每翻一倍,信号量翻倍,但运动模糊的风险也翻倍。
2.2.2 ISO(增益)
ISO本质上不是“感光度”,而是模拟增益。传感器本身对光的敏感度是固定的,ISO只是把信号放大。放大信号的同时,噪声也被放大了。
我曾经做过一个实验:用同一台相机,在相同光照下,分别用ISO 100和ISO 3200拍一张灰卡。结果ISO 3200的图像信噪比(SNR)低了将近15 dB。说白了,ISO就是一把双刃剑——它让你在暗处看到东西,但代价是画质下降。
| ISO值 | 增益倍数 | 信号强度 | 噪声强度 | 信噪比(SNR) | 适用场景 |
|---|---|---|---|---|---|
| 100 | 1x | 高 | 低 | 高 | 充足光照 |
| 400 | 4x | 中 | 中 | 中 | 室内/黄昏 |
| 1600 | 16x | 低 | 高 | 低 | 暗光手持 |
| 6400 | 64x | 极低 | 极高 | 极低 | 极限暗光 |
为什么会这样?因为噪声是跟增益一起放大的。传感器读出噪声、暗电流噪声、热噪声,这些在低ISO时可能不明显,但ISO一高,它们全冒出来了。我建议:能用曝光时间解决的问题,别用ISO。
2.3 暗电流与热噪声
这两个是低光照成像的“天敌”。你想想看,在暗光下,信号本身就很弱,如果传感器自己还在“发热”产生额外的电子,那画面里就会出现不该有的亮点和条纹。
2.3.1 暗电流
暗电流,就是没有光照时,传感器像素里自发产生的电子。它来源于硅材料的热激发——温度越高,电子越容易从价带跃迁到导带。暗电流的大小跟温度呈指数关系。
我记得有一次做安防摄像头的低光照测试,把相机放在室外零下10度的环境里,暗电流几乎可以忽略。但夏天室内30度时,暗电流直接翻了好几倍。这就是为什么高端相机有制冷模块——把传感器温度降到零下几十度,暗电流就几乎为零了。
注意:暗电流不是均匀分布的。每个像素的暗电流大小不同,这会导致“固定模式噪声”(FPN)。在长曝光(比如几秒甚至几十秒)的低光照拍摄中,暗电流会积累成明显的亮斑或条纹。我曾经用一台手机拍30秒的星空,结果画面里全是暗电流造成的“热像素”,星星反而看不清了。
2.3.2 热噪声
热噪声,也叫约翰逊-奈奎斯特噪声(Johnson-Nyquist noise),是电子在导体中随机热运动产生的。它跟温度有关,跟频率无关——也就是说,所有频率上都有,属于白噪声的一种。
热噪声在CMOS传感器里主要影响读出电路。放大器、ADC这些模拟电路都会产生热噪声。温度每升高10度,热噪声功率大约增加3 dB。
我个人的经验是:在低光照增强算法里,热噪声是最难处理的。因为它随机性太强,时域滤波(比如多帧平均)效果不错,但会引入运动伪影。空域滤波(比如双边滤波)能保留边缘,但容易把细节磨平。
2.3.3 暗电流与热噪声的对比
| 特性 | 暗电流 | 热噪声 |
|---|---|---|
| 来源 | 硅材料热激发 | 电子随机热运动 |
| 与温度关系 | 指数关系 | 线性关系(功率) |
| 与曝光时间关系 | 线性积累 | 不积累(每帧独立) |
| 空间分布 | 固定模式(FPN) | 随机分布 |
| 频率特性 | 低频为主 | 白噪声(全频) |
| 抑制方法 | 暗帧减除、制冷 | 时域/空域滤波 |
核心结论:低光照增强的第一步,不是增强信号,而是抑制噪声。暗电流可以通过“暗帧减除”来校正——拍一张完全遮光的帧,记录每个像素的暗电流值,然后从正常帧里减去。热噪声则需要更复杂的滤波算法。我在项目中经常把这两种噪声分开处理:先做暗帧减除去掉FPN,再做时域滤波去掉热噪声。