图像噪声基础:从光子到数字的“杂质”
做ISP算法,说白了就是跟噪声打交道。你想想看,传感器把光转成电信号,再转成数字码值,每一步都会引入“杂质”。这些杂质就是噪声。我刚开始接触这行时,总觉得降噪就是“磨皮”,后来踩了不少坑才明白——不懂噪声来源和模型,调参就是瞎蒙。
这一章我们就把噪声的底细摸清楚。从物理源头到数学模型,再到两个最核心的指标:信噪比和动态范围。
2.1 噪声从哪来?三大源头
图像噪声不是单一的东西。它像一锅粥,各种成分混在一起。我个人习惯按产生阶段分成三类:
| 噪声类型 | 产生阶段 | 物理本质 | 工程影响 |
|---|---|---|---|
| 光子噪声 | 光电转换 | 光子到达的随机性 | 低光照下最明显,无法消除 |
| 读出噪声 | 模拟电路 | 电子热运动、电路非理想性 | 暗场景主导,与增益相关 |
| 量化噪声 | ADC转换 | 有限比特位截断误差 | 高动态场景下可见 |
2.1.1 光子噪声——躲不开的物理极限
光是由光子组成的。到达每个像素的光子数量,服从泊松分布。什么意思?就是同一光照下,每个像素接收到的光子数不一样。这就像下雨天接雨水,每个桶接到的水滴数总有差异。
我在项目中遇到过一件事:用同一颗sensor拍均匀灰卡,raw图放大后居然有颗粒感。当时新人问我是不是sensor坏了。我说不是,这是光子噪声,物理极限。你换再贵的sensor也躲不掉。
关键公式:光子噪声的标准差 = √(信号强度)。信号越强,噪声值越大,但信噪比反而越高。
2.1.2 读出噪声——电路里的“杂音”
读出噪声是模拟电路引入的。包括像素复位噪声、放大器热噪声、1/f噪声等。这部分噪声跟信号无关,是加性噪声。
嗯,这里要注意:读出噪声在暗场景下特别要命。因为光子信号弱,读出噪声就成了主要成分。我调过一款手机sensor,暗光下raw图有横条纹,查了半天发现是读出电路电源纹波耦合进来的。后来加了去耦电容才解决。
避坑指南:我曾经在调试夜景模式时,发现增益一拉高,噪声就爆炸。后来分析发现是读出噪声被放大了。记住:读出噪声与增益成正比,高ISO下尤其明显。
2.1.3 量化噪声——ADC的“舍入误差”
ADC把模拟电压转成数字码值,精度有限。10bit ADC有1024个码值,12bit有4096个。转换时必然有舍入误差,这就是量化噪声。
量化噪声的幅度是固定的:±0.5 LSB。说白了,就是数字信号永远无法完美还原模拟信号。不过别担心,在12bit以上的系统中,量化噪声通常被其他噪声掩盖了。
2.2 噪声模型:用数学描述“杂质”
搞ISP算法,光知道噪声来源不够。你得能用数学模型描述它,才能在算法里做针对性处理。我常用的噪声模型有三种:
2.2.1 高斯分布——最常用的近似
高斯分布,也叫正态分布。它的概率密度函数是:
p(x) = (1 / (σ * √(2π))) * exp(-(x - μ)² / (2σ²))
其中μ是均值,σ是标准差。读出噪声和量化噪声,通常用高斯模型近似。为什么?因为中心极限定理——大量独立随机变量之和趋近高斯分布。
我个人习惯:在算法实现中,高斯噪声模型是最容易处理的。很多降噪算法(如高斯滤波、双边滤波)都基于这个假设。
工程技巧:实际sensor的读出噪声往往不是完美高斯,有拖尾。我建议在标定时多采几帧,用直方图拟合出真实分布,别直接套理想模型。
2.2.2 泊松分布——光子噪声的精确描述
泊松分布描述单位时间内随机事件发生的次数。光子到达像素的过程,完美符合泊松分布。
泊松分布的特点是:均值 = 方差。也就是说,信号强度决定了噪声水平。信号越强,噪声方差越大。
你想想看,这跟高斯分布完全不同。高斯噪声的方差是常数,泊松噪声的方差随信号变化。所以光子噪声是信号相关的。
2.2.3 瑞利分布——特殊场景的噪声
瑞利分布不太常见,但在某些场景下会出现。比如SAR雷达图像中的相干斑噪声,或者某些sensor在极低光照下的噪声分布。
瑞利分布的概率密度:
p(x) = (x / σ²) * exp(-x² / (2σ²)), x ≥ 0
它的特点是:非负、右偏。我在项目中遇到过瑞利噪声吗?说实话,很少。但知道它的存在,遇到奇怪噪声时能多一个排查方向。
2.3 信噪比与动态范围——两个核心指标
这两个指标是评价sensor和ISP算法的硬通货。不懂它们,没法跟硬件工程师沟通。
2.3.1 信噪比(SNR)
信噪比就是信号功率与噪声功率的比值。单位是dB:
SNR(dB) = 10 * log10(信号功率 / 噪声功率)
在图像领域,我们通常用峰值信噪比(PSNR)来评价图像质量。PSNR越高,图像越干净。
| PSNR范围 | 主观感受 | 典型场景 |
|---|---|---|
| > 40 dB | 几乎无噪声 | 专业相机、良好光照 |
| 30 - 40 dB | 轻微噪声 | 手机白天拍摄 |
| 20 - 30 dB | 明显噪声 | 手机暗光拍摄 |
| < 20 dB | 噪声严重 | 极限暗光、监控夜视 |
我的经验:在ISP调优中,SNR提升3dB,人眼就能感知到明显改善。但提升6dB以上,才会觉得“干净”。别被纸面数据骗了,最终要看主观效果。
2.3.2 动态范围(DR)
动态范围是sensor能同时记录的最亮和最暗区域的比值。单位也是dB:
DR(dB) = 20 * log10(满阱容量 / 读出噪声)
说白了,动态范围决定了你能不能同时拍清楚亮部和暗部。高动态范围的sensor,能保留更多细节。
我记得有一次调HDR算法,sensor的DR只有60dB,拍逆光场景时亮部过曝、暗部死黑。后来换了DR 72dB的sensor,效果立竿见影。所以DR是硬件底子,算法只能锦上添花。
2.4 本章知识体系
下面这张图总结了噪声的来源、模型和核心指标的关系。建议你保存下来,后面调算法时随时对照。
2.5 工程落地:噪声标定与建模
理论讲完了,说点实际的。在ISP工程中,我们怎么用这些知识?
- 标定噪声参数:拍均匀灰卡,采集多帧raw图,统计每个像素的均值和方差。拟合出光子噪声和读出噪声的比例。
- 建立噪声模型:用公式
σ² = a * S + b拟合,其中a是光子噪声系数,b是读出噪声方差,S是信号强度。 - 指导降噪参数:根据噪声模型,动态调整降噪强度。暗区多用时域降噪,亮区多用空域降噪。
实用建议:我建议你在项目中保留一份噪声标定脚本。每次换sensor或改模组,先跑一遍标定,拿到a和b系数。后面调降噪参数时,心里就有底了。
好了,这一章的内容就到这里。噪声基础是ISP算法的地基,后面讲具体降噪算法时,我们会反复用到这些概念。记住:不懂噪声,就别谈降噪。