第2章:降噪算法基础理论——高斯噪声与泊松噪声模型

做ISP降噪这么多年,我最大的感触是:不懂噪声模型,调出来的降噪参数就是碰运气。你想想看,连对手长什么样都不知道,怎么打?

这一章,咱们就把噪声的底细摸清楚。我会从工程落地的角度讲,不扯太深的数学,但核心原理必须吃透。

2.1 噪声从哪来?——传感器物理模型

图像传感器上的噪声,说白了就两大类:

  • 固定模式噪声(FPN):像素之间的暗电流差异,跟温度、曝光时间有关。高通平台上有专门的FPN校准流程,这里不展开。
  • 随机噪声:这才是降噪算法要处理的核心。随机噪声又分两种——高斯噪声和泊松噪声。

我在项目中遇到过最头疼的情况:一个暗光场景,降噪参数怎么调都糊。后来一查,是泊松噪声模型没建对,光子散粒噪声被当成了高斯噪声处理。嗯,这个坑我踩过,你们别踩。

2.2 高斯噪声模型

高斯噪声,也叫加性高斯白噪声(AWGN)。它的特点是:

  • 加性:噪声直接加到信号上,跟信号强度无关
  • 高斯分布:概率密度函数是钟形曲线
  • 白噪声:功率谱密度在整个频域内均匀分布

数学上长这样:

p(x) = (1 / (σ * √(2π))) * exp(-(x - μ)² / (2σ²))

其中μ是均值(通常为0),σ是标准差(决定噪声强度)。

工程经验:在高通平台上,高斯噪声模型主要用于亮光场景。当ISO较低(100-400)时,传感器读出噪声占主导,这玩意儿就是高斯分布的。我习惯用σ=2-5作为初始值,具体看sensor的模拟增益。

2.3 泊松噪声模型

泊松噪声就有点不一样了。它跟信号强度相关——信号越强,噪声越大。这玩意儿也叫散粒噪声,是光子到达的随机性造成的。

关键特性:

  • 信号相关:噪声方差 = 信号强度
  • 低光时明显:暗光下信噪比低,泊松噪声特别扎眼
  • 非高斯:低光下分布偏斜,高光下近似高斯

为什么会这样?你想想看,光子到达传感器就像下雨,雨滴落下的数量是随机的。光越强,雨滴越多,但随机波动也越大。

避坑指南:我曾经在调试夜景模式时,直接用高斯模型去拟合暗部噪声,结果降噪后出现明显的纹理残留和色斑。后来改用泊松-高斯混合模型,问题才解决。记住:暗光场景必须考虑泊松噪声。

2.4 空域降噪算法

空域降噪,就是在像素域直接操作。我按复杂度从低到高讲。

2.4.1 均值滤波

原理很简单:用邻域像素的平均值代替中心像素。

// 3x3均值滤波核
[1/9, 1/9, 1/9]
[1/9, 1/9, 1/9]
[1/9, 1/9, 1/9]

优点:实现简单,计算快。
缺点:边缘糊得一塌糊涂。我在高通平台上几乎不用它做主力降噪,最多用来做预处理。

2.4.2 中值滤波

取邻域像素的中位数。对椒盐噪声效果极好,对高斯噪声一般。

// 3x3窗口排序后取中间值
输入: [12, 15, 18, 20, 255, 22, 14, 16, 19]
排序: [12, 14, 15, 16, 18, 19, 20, 22, 255]
输出: 18  // 中位数,去掉了椒盐噪声
个人习惯:中值滤波我主要用在坏点校正环节。高通平台上有专门的BPC(坏点校正)模块,底层就是中值滤波的变种。但注意,中值滤波会损失细节,别在纹理区用。

2.4.3 高斯滤波

这是空域降噪的主力。它用高斯函数生成权重,离中心越近的像素权重越大。

// 5x5高斯核,σ=1.0
[0.003, 0.013, 0.022, 0.013, 0.003]
[0.013, 0.059, 0.097, 0.059, 0.013]
[0.022, 0.097, 0.159, 0.097, 0.022]
[0.013, 0.059, 0.097, 0.059, 0.013]
[0.003, 0.013, 0.022, 0.013, 0.003]

高斯滤波的关键参数是σ:

σ值 效果 适用场景
0.5 - 1.0 轻微平滑,保留边缘 亮光场景,低ISO
1.0 - 2.0 中等平滑 室内光线,中等ISO
2.0 - 4.0 强平滑,细节损失大 暗光场景,高ISO
工程技巧:高通平台上的高斯滤波通常用可分离滤波实现——先水平方向滤波,再垂直方向滤波。这样5x5核只需要10次乘法,而不是25次。我在优化性能时经常用这招。

2.5 频域降噪算法

频域降噪的思路不一样——把图像变换到频域,噪声和信号在频域里分得更开。

2.5.1 小波降噪

小波变换把图像分解成不同尺度的子带:

  • LL子带:低频近似,包含主要结构
  • LH/HL/HH子带:高频细节,包含边缘和噪声

降噪流程:

  1. 对图像做小波分解(通常3-5层)
  2. 对高频子带做阈值处理(软阈值或硬阈值)
  3. 重构图像
// 软阈值函数
def soft_threshold(x, T):
    return sign(x) * max(|x| - T, 0)

// 硬阈值函数
def hard_threshold(x, T):
    return x if |x| > T else 0

我建议用软阈值。硬阈值会产生振铃效应,在图像边缘附近特别明显。这个坑我踩过——有一次用硬阈值降噪,结果输出图像边缘有鬼影,被客户投诉了。

2.5.2 FFT降噪

FFT(快速傅里叶变换)把图像从空间域转到频率域。噪声在高频区域能量集中,用低通滤波器就能去掉。

常见滤波器:

滤波器类型 传递函数 特点
理想低通 截止频率内为1,外为0 振铃效应严重
巴特沃斯低通 1 / (1 + (D/D0)^(2n)) 平滑过渡,振铃少
高斯低通 exp(-D² / (2*D0²)) 最平滑,无振铃
注意:FFT降噪在工程落地中不常用。为什么?计算量大,而且对非平稳噪声(比如泊松噪声)效果不好。高通平台的ISP pipeline里,FFT主要用于去马赛克和镜头阴影校正,降噪还是靠空域+小波。

2.6 本章知识体系

下面这张图把本章的核心逻辑串起来了:

降噪算法基础理论——知识体系 噪声模型 高斯噪声(加性,信号无关) 泊松噪声(信号相关,散粒噪声) 空域降噪(像素域操作) 频域降噪(变换域操作) 均值滤波 中值滤波 高斯滤波 小波降噪 FFT降噪 工程落地:高通ISP Pipeline集成 核心原则 亮光场景 → 高斯模型 + 空域滤波 | 暗光场景 → 泊松模型 + 频域/小波滤波

2.7 工程落地要点

最后,我总结几条实战经验:

高通平台降噪选型建议:
  • 亮光(ISO ≤ 400):高斯滤波 + 小波软阈值,σ=1.0-1.5
  • 中等光线(ISO 400-1600):双边滤波 + 小波,σ=1.5-2.5
  • 暗光(ISO ≥ 1600):泊松-高斯混合模型 + 非局部均值(NLM),σ=2.5-4.0

记住:没有万能的降噪算法。我见过太多人想用一个参数打天下,结果亮光糊、暗光噪。正确的做法是:根据ISO和场景亮度,动态切换降噪策略。高通平台的ISP pipeline支持多组参数切换,这个咱们后面章节会详细讲。