第三章 噪声模型与统计特性:光子散粒噪声、读出噪声与热噪声、1/f噪声与固定模式噪声、噪声功率谱密度分析
做图像传感器ISP算法,说白了就是在跟噪声打仗。你想想看,一张夜景照片,暗部全是花花绿绿的彩噪,亮部细节糊成一团——这就是噪声在捣鬼。我入行那会儿,第一个项目就是做降噪,结果被各种噪声搞得焦头烂额。后来才明白,不懂噪声模型,降噪算法就是瞎调参数。
这一章,咱们把噪声的底裤扒干净。从物理源头到统计特性,再到频域分析,一条线捋清楚。
3.1 光子散粒噪声:躲不开的量子宿命
光子散粒噪声,是所有噪声里最“公平”的一个。为什么?因为它来自光的量子本质。光打到像素上,不是连续的,而是一个一个光子蹦过来。单位时间内到达的光子数,服从泊松分布。
我习惯用这个公式来理解:
σ_shot² = μ_photo
噪声方差等于信号均值。这意味着什么?信号越强,噪声也越大。但信噪比呢?
SNR_shot = μ_photo / σ_shot = √μ_photo
信号翻倍,信噪比只涨√2倍。这就是物理极限,谁也绕不开。
关键结论:光子散粒噪声是泊松过程,方差=均值。高光区域信噪比高,暗部信噪比低——这是夜景拍摄的先天劣势。
我在项目中遇到过一个问题:某款传感器在低光下,暗部噪声模型怎么都对不上。后来发现,是散粒噪声和读出噪声的交叉项没处理好。嗯,这里要注意,实际传感器里,散粒噪声不是独立存在的。
3.2 读出噪声与热噪声:电路里的“热运动”
读出噪声,是传感器把电荷转成电压、再转成数字信号时引入的。这里面最核心的,就是热噪声。
热噪声的功率谱密度是平坦的:
S_thermal(f) = 4kTR
k是玻尔兹曼常数,T是温度,R是电阻。温度越高,噪声越大。这也是为什么手机拍夜景,机身发热后噪点会明显变多。
| 噪声类型 | 物理来源 | 统计特性 | 温度相关性 |
|---|---|---|---|
| 热噪声 | 载流子随机热运动 | 高斯分布,白噪声 | 强正相关 |
| 1/f噪声 | 材料缺陷、界面陷阱 | 非平稳,低频主导 | 弱相关 |
| 散粒噪声 | 光子/载流子离散性 | 泊松分布 | 无直接相关 |
读出噪声里还有一个容易被忽略的——复位噪声(kTC噪声)。每次复位像素,电容上的热噪声都会被采样。我刚开始做ISP时,死活想不通为什么暗帧噪声那么大,后来一查,kTC噪声占了小一半。
避坑指南:我曾经在调试一款1/1.7英寸传感器时,发现暗电流噪声和读出噪声混在一起分不开。后来用双采样(CDS)才把复位噪声压下去。记住,CDS只能消固定模式噪声和kTC噪声,对热噪声无效。
3.3 1/f噪声与固定模式噪声:低频的“幽灵”
1/f噪声,也叫闪烁噪声。它的功率谱密度跟频率成反比:
S_1f(f) ∝ 1/f^α
α通常在0.8到1.2之间。低频下,这个噪声非常明显。你拍一张长曝光夜景,画面里那种缓慢漂移的亮度变化,就是1/f噪声在作怪。
固定模式噪声(FPN)就更有意思了。它不是随机的,而是每个像素有自己的“个性”。有的像素偏亮,有的偏暗,拍出来就是固定的网格或条纹。
FPN分两种:
- 行FPN:整行像素有相同的偏移,表现为水平条纹
- 列FPN:整列像素有相同的偏移,表现为垂直条纹
- 像素FPN:每个像素独立的偏移,表现为固定网格
我处理过一个案例:某款传感器在低增益下FPN不明显,但一开高增益,垂直条纹全出来了。后来发现是列放大器匹配问题。嗯,FPN这东西,校准好了就是常数,校准不好就是噩梦。
注意:FPN在空间域是固定的,但在时间域是常数。所以降噪算法里,FPN必须用标定法去除,不能用时域滤波——因为时域滤波对常数无效。
3.4 噪声功率谱密度分析:从时域到频域
光看时域统计还不够。噪声在频域里的分布,直接决定了降噪算法的设计方向。
噪声功率谱密度(PSD)的定义很简单:
PSD(f) = lim(T→∞) (1/T) * |X(f)|²
但实际分析时,我更喜欢用Welch法做周期图平均。为什么?因为单次FFT的方差太大,平均几次才能看到真实谱。
不同类型的噪声,PSD形状完全不同:
- 白噪声:PSD平坦,所有频率能量相同
- 1/f噪声:PSD随频率降低而升高,低频能量集中
- 带限噪声:PSD只在特定频段有能量
下面这张图,是我自己画的一个噪声PSD分析框架。它把传感器噪声的频域特性、空间特性、以及ISP处理流程串起来了。
实际做PSD分析时,我习惯先采集一组暗帧(盖上镜头盖),再采集一组亮帧(均匀光照)。暗帧的PSD就是读出噪声+热噪声+1/f噪声,亮帧的PSD减去暗帧,剩下的就是散粒噪声。
实战技巧:用暗帧PSD的平坦部分估算白噪声基底,用低频段的斜率估算1/f噪声的α值。这两个参数,直接决定了你的降噪滤波器该用多大截止频率。
3.5 噪声模型的工程落地
理论讲完了,咱们说说怎么用。在高通ISP里,噪声模型不是摆着看的,它直接参与降噪参数的计算。
我常用的一个简化模型:
σ_total² = σ_shot² + σ_read² + σ_1f² + σ_fpn²
其中:
- σ_shot² = K * signal(K是散粒噪声增益)
- σ_read² = 常数(读出噪声方差)
- σ_1f² = A / f^α(1/f噪声)
- σ_fpn² = 常数(固定模式噪声)
这个模型,在夜景模式下特别有用。因为夜景信号弱,散粒噪声占比下降,读出噪声和FPN就成了主要矛盾。我调过一款高通骁龙平台的夜景算法,就是靠这个模型把暗部信噪比提了3dB。
个人经验:模型参数不要全信datasheet。我每次拿到新传感器,第一件事就是自己测噪声曲线。用灰阶卡拍18%灰、50%灰、90%灰,拟合出K和σ_read。datasheet给的参数,往往偏理想。