传感器物理与噪声模型:CMOS传感器工作原理、光子噪声与读出噪声

做RAW域去噪,你首先得搞清楚——噪声到底是从哪来的?

很多人一上来就调网络、改loss,结果效果上不去。为什么?因为你连噪声的“脾气”都没摸透。我个人习惯,拿到一个RAW图,第一件事不是跑模型,而是先分析它的噪声特性。这就像修车,你得先听发动机的声音,不能上来就拆零件。

CMOS传感器工作原理

先简单过一下CMOS传感器是怎么工作的。你想想看,光线打到像素上,光子被光电二极管吸收,转化成电子。这些电子被收集、存储,然后通过模数转换器(ADC)变成数字值。整个过程,说白了就是“光子→电子→电压→数字”的链条。

但问题来了——这个链条的每一环,都会引入噪声。

我在项目中遇到过一种情况:同一款传感器,在不同温度下拍出来的暗电流噪声能差好几倍。嗯,这里要注意,温度是噪声的放大器,尤其是长曝光场景。

核心要点:CMOS传感器的输出值 = 真实信号 + 光子噪声 + 读出噪声 + 其他固定模式噪声。去噪的本质,就是从被污染的信号中恢复出干净的真实信号。

光子噪声(泊松分布)

光子噪声,也叫散粒噪声。它是物理极限,你躲不掉的。

为什么?因为光子的到达是随机的。打个比方,你站在雨里,每秒钟落在你头上的雨滴数不是固定的,有时多几滴,有时少几滴。光子也一样,即使光源完全稳定,每个像素接收到的光子数也会波动。

这个波动服从泊松分布。泊松分布有个重要性质:均值等于方差。也就是说,信号越强,噪声也越强。

数学上,如果真实光子数为λ,那么实际观测到的光子数k的概率为:

P(k) = (λ^k * e^(-λ)) / k!

噪声的标准差就是√λ。信噪比(SNR)呢?SNR = λ / √λ = √λ。所以信号越强,信噪比越高。这就是为什么暗光下噪声特别明显——光子太少,信噪比太低。

我的经验:我曾经在夜景RAW图上直接套用高斯噪声模型做训练,结果模型在暗部完全失效。后来改成泊松-高斯混合模型,效果立竿见影。记住:光子噪声是信号相关的,不能用固定方差的高斯噪声来近似。

读出噪声(高斯分布)

读出噪声是传感器在读取电荷、放大信号、模数转换过程中引入的噪声。它和信号强度无关,基本上是固定的。

读出噪声通常服从高斯分布,均值为0,方差为σ²。它的来源包括:

  • 复位噪声:像素复位时,电容上的电压波动
  • 放大器噪声:源跟随器、列放大器等电路的热噪声
  • 量化噪声:ADC将模拟信号转为数字值时产生的舍入误差

读出噪声的单位通常是电子数(e⁻),或者用DN(数字值)表示。好的传感器,读出噪声可以低到1-2 e⁻;差一点的,可能到10 e⁻以上。

避坑指南:我曾经在标定传感器时,忽略了读出噪声的“行相关”特性。结果发现,同一行像素的读出噪声有很强的相关性,导致去噪后出现横条纹。后来我加了一个行噪声估计模块才解决。所以,读出噪声不一定是纯随机的,它可能有空间结构。

噪声模型数学表达

把上面两种噪声合在一起,就得到了经典的泊松-高斯噪声模型:

观测值 = 真实信号 + 光子噪声 + 读出噪声

数学上:
y = x + n_p(x) + n_g

其中:
- y: 观测到的像素值
- x: 真实信号(光子数)
- n_p(x): 光子噪声,服从泊松分布,方差 = x
- n_g: 读出噪声,服从高斯分布,方差 = σ²

实际应用中,我们通常用近似模型:

y ≈ x + √(x) * ε_p + σ * ε_g

其中 ε_p ~ N(0,1), ε_g ~ N(0,1)

这个近似的好处是,把泊松噪声变成了信号相关的加性高斯噪声。虽然不精确,但计算方便,很多去噪算法都用它。

更精确的做法是方差稳定变换(VST),比如Anscombe变换,把泊松-高斯噪声转换成近似的高斯噪声。我在做传统去噪算法时经常用这招,但在深度学习时代,我建议直接让网络学习这个噪声分布,效果更好。

总结一下噪声模型的三个关键参数:

参数 含义 如何获取
增益(gain) 电子数到DN的转换系数 传感器标定或厂家提供
读出噪声方差 高斯噪声的强度 暗帧(盖住镜头)统计
光子噪声系数 泊松噪声的缩放因子 平场(均匀光照)统计

知识体系总览

下面这张图,把本章的核心逻辑串起来了。你可以把它当作一个“噪声地图”,以后遇到RAW图,按图索骥就行。

CMOS传感器噪声模型知识体系 CMOS传感器 光子噪声(散粒噪声) 服从泊松分布:均值 = 方差 信号相关:暗光下更明显 读出噪声 服从高斯分布:均值为0 信号无关:固定方差 泊松-高斯噪声模型 y = x + √(x)·ε_p + σ·ε_g | 去噪的本质:从y中恢复x

这张图把CMOS传感器的噪声来源、分布特性、以及最终的数学模型串在了一起。你仔细看,左边是光子噪声,右边是读出噪声,它们在底部汇合成泊松-高斯模型。这就是我们做RAW域去噪的理论基础。

一个小建议:刚开始接触噪声模型时,别急着背公式。先拿一张RAW图,用代码统计一下不同亮度区域的噪声方差。你会发现,暗区噪声方差小但信噪比低,亮区噪声方差大但信噪比高。亲手验证过,印象才深刻。