068、RGB 域降噪:RGB 空间的频域降噪、NLM 与小波降噪的工程实现
068、RGB 域降噪:RGB 空间的频域降噪、NLM 与小波降噪的工程实现
一、从一次“噪点翻车”说起
去年调一款中端平台,Sensor 是 IMX586,夜景模式跑在 12M 全尺寸输出。实验室测 SNR 数据漂亮,结果送去 DXO 评测,暗部纹理评分直接掉了 8 分。拆 log 一看,问题出在 RGB 域降噪——我们当时在 YUV 域做了双边滤波,但 RGB 通道间的色噪(chroma noise)被 Y 通道的亮度降噪给“压死”了,导致暗部出现彩色斑点,像油画一样。更坑的是,平台 ISP 的 3DNR 模块只支持 YUV 输入,RGB 域降噪得自己写。那段时间天天盯着示波器看波形,最后发现:RGB 域降噪不是“能不能做”,而是“怎么做才能不翻车”。
二、RGB 域降噪的“坑”在哪
很多人觉得 RGB 域降噪就是换个色彩空间做滤波,其实不然。RGB 三个通道的噪声特性不一样——G 通道量子效率高,噪声通常比 R/B 低 2-3dB。如果你用同一套参数去降噪,G 通道会被过度平滑,导致绿色区域出现“塑料感”。更麻烦的是,RGB 通道间的相关性很强,单独处理每个通道会破坏色彩一致性,比如红色区域边缘会出现绿色伪影。
我踩过最深的坑:在 RGB 域直接套用 YUV 域的 NLM 算法。YUV 域的 NLM 搜索窗口可以设得很大(比如 21x21),因为 Y 通道的纹理信息丰富。但 RGB 域不行——R 通道的纹理信息稀疏,大窗口搜索会匹配到不相关的像素,产生“鬼影”。
