第三章 Demosaic与去噪:从马赛克到纯净图像
各位好,欢迎来到第三章。今天聊的话题,是ISP Pipeline里最基础、也最考验功底的两个模块——Demosaic和去噪。
我经常跟新人说,你去看一颗Sensor的Raw图,那满屏的RGBG马赛克,就像一块没拼完的拼图。Demosaic就是把这拼图拼成完整的彩色图像。而去噪,则是把拼图过程中产生的瑕疵、灰尘统统擦掉。
这两个模块是串在一起的。你Demosaic做不好,去噪再强也救不回来。反过来,去噪太猛,Demosaic的边缘细节就糊了。嗯,这里面的平衡,咱们今天好好拆解一下。
3.1 颜色插值算法:从Bayer到RGB
先看Demosaic。说白了,就是每个像素只采集了一种颜色(R、G或B),我们需要用周围像素的信息,把缺失的两种颜色猜出来。
3.1.1 双线性插值
最朴素的方法,就是双线性插值。拿一个Bayer Pattern的G像素举例,它缺R和B,那就直接取周围R和B的平均值。
我刚开始做ISP的时候,觉得这方法太简单了,肯定不行。后来发现,在光照均匀、纹理平坦的区域,双线性插值其实够用,而且计算量极低。但一到边缘和纹理密集的地方,就露馅了——伪彩色、锯齿,全跑出来了。
双线性插值的核心问题:它假设颜色变化是线性的,但真实世界的边缘往往是突变的。所以边缘处会出现“拉链效应”和“假彩色”。
3.1.2 边缘导向插值
那怎么改进?我个人的习惯是,先判断边缘方向,再沿着边缘方向插值,而不是盲目地四周平均。
举个例子,如果当前像素位于一条水平边缘上,那垂直方向的颜色变化剧烈,水平方向变化平缓。这时候,我们只取水平方向的相邻像素做插值,就能避免跨过边缘引入错误颜色。
具体实现上,常见的方法有:
- 梯度检测法:计算水平和垂直方向的梯度,选择梯度小的方向进行插值。
- Hamilton-Adams算法:在梯度检测的基础上,引入色差(Color Difference)的概念,利用G通道的连续性来修正R和B。
- 自适应插值:根据局部纹理复杂度,动态切换插值策略。
我在项目中遇到过一个问题:用边缘导向插值后,某些斜线边缘还是会有锯齿。后来发现,是因为只考虑了水平和垂直两个方向。加上45度和135度方向后,效果就好多了。
避坑指南:边缘方向检测的阈值设置很关键。阈值设得太低,平坦区域也会被误判为边缘,产生不必要的纹理;设得太高,边缘又插值不干净。我曾经在一个低光场景下调试了整整两天,最后发现是阈值没跟着ISO走。
3.2 空域去噪与频域去噪
Demosaic做完,图像是彩色的了,但噪声也放大了。尤其是低光场景,那噪点简直不忍直视。去噪,就是ISP里最吃算力的模块之一。
3.2.1 空域去噪
空域去噪,直接在像素域操作。最经典的就是高斯滤波、双边滤波、非局部均值(NLM)。
双边滤波我用的最多。它既考虑了空间距离,又考虑了像素值差异。说白了,就是“颜色相近、距离又近的像素才一起平均”。这样能保边去噪,效果比高斯滤波好得多。
但双边滤波有个毛病——梯度反转。在强边缘附近,如果参数没调好,会出现“光晕”或者“浮雕”效果。我踩过这个坑,后来加了一个梯度修正的步骤才解决。
| 算法 | 保边能力 | 计算量 | 典型场景 |
|---|---|---|---|
| 高斯滤波 | 差 | 低 | 平坦区域预处理 |
| 双边滤波 | 好 | 中 | 通用去噪,需调参 |
| NLM | 极好 | 高 | 低光、高ISO场景 |
| 引导滤波 | 好 | 低 | 实时系统,边缘保持 |
3.2.2 频域去噪
频域去噪,就是把图像变换到频率域(比如DCT、小波),然后对高频分量做衰减。因为噪声通常集中在高频,而图像细节也在高频,所以难点在于区分“噪声”和“细节”。
小波去噪我用的比较多。它能把图像分解成不同尺度的子带,每个子带代表不同频率和方向的信息。然后对高频子带做软阈值或硬阈值处理。
你想想看,如果阈值设得太高,细节就没了,图像变得像塑料一样平滑。设得太低,噪声又去不干净。这个度,全靠经验和场景适配。
注意:频域去噪容易产生“振铃效应”(Ringing Artifact),尤其是在强边缘附近。表现为边缘周围出现一圈一圈的波纹。我建议在频域处理完后,加一个后处理步骤来抑制振铃。
3.3 高通SNR模块详解
好了,终于到重头戏了。高通平台的SNR(Spatial Noise Reduction)模块,是它ISP里最核心的去噪引擎。我调过好几个高通平台的相机,SNR模块的配置直接影响最终画质。
3.3.1 SNR模块架构
高通的SNR不是单一算法,而是一个多级、多尺度的去噪框架。它通常包含:
- 预处理级:对Raw域做简单的暗电流校正和固定模式噪声去除。
- 主去噪级:基于多尺度分解(类似小波或拉普拉斯金字塔),对每个尺度做自适应去噪。
- 后处理级:对去噪后的图像做边缘增强和纹理恢复,避免过度平滑。
我个人觉得,SNR模块最厉害的地方在于它的“自适应”能力。它会根据局部亮度、纹理复杂度、ISO值,动态调整去噪强度。低光区域重去噪,高光区域轻去噪,边缘区域保细节。
3.3.2 关键参数与调优
在QCT(Qualcomm Camera Tuning)工具里,SNR模块的参数非常多。我挑几个最关键的说说:
| 参数名 | 作用 | 调优建议 |
|---|---|---|
| Strength | 整体去噪强度 | 按ISO分段设置,低ISO设低,高ISO设高 |
| Edge Threshold | 边缘保护阈值 | 设得太低,边缘被磨平;太高,噪声残留 |
| Texture Preservation | 纹理保留程度 | 人像场景设高,风景场景可适当降低 |
| Chroma Noise Reduction | 彩色噪声去除 | 低光场景建议开大,但注意不要偏色 |
我曾经在一个夜景项目里,SNR的Strength参数从0调到100,图像从“全是噪点”变成“像油画一样平滑”。最后取了个中间值60,再配合Edge Threshold微调,才找到那个“干净又不失细节”的平衡点。
3.3.3 SNR与3A的联动
这里要特别提一下,SNR不是独立工作的。它和AEC(自动曝光控制)、AWB(自动白平衡)有很强的联动。
举个例子,AEC把曝光时间拉长,ISO降低,噪声自然就少了,SNR的负担就轻了。反过来,如果AEC为了防抖把曝光时间缩短,ISO飙高,SNR就得加大力度去噪。
我建议在做Tuning的时候,先把AEC策略定好,再调SNR。否则你SNR调了半天,AEC一改,全白费。
核心思路:去噪不是万能的。最好的去噪,是在源头减少噪声——也就是通过3A算法让Sensor工作在最佳信噪比区间。SNR只是最后一道防线。
本章知识结构图
下面这张图,把Demosaic和去噪的流程、算法分类、以及高通SNR模块的位置串起来了。你可以把它当作本章的“地图”。
好了,这一章的内容就到这里。Demosaic和去噪,看似基础,但里面的门道很深。你把这些基础打牢了,后面学HDR、多帧合成、AI去噪这些高级功能,才能理解它们到底在解决什么问题。