4、去马赛克(Demosaic)调试:算法原理、伪彩色抑制、边缘保护参数调优。

好,咱们进入第四章。去马赛克,英文叫 Demosaic,是 ISP 管线里非常关键的一步。说白了,就是把拜耳阵列(Bayer Pattern)上那些红绿蓝单通道的像素点,通过算法插值,还原成每个像素都有完整 RGB 三通道信息的彩色图像。

你想想看,传感器本身是色盲的,它只记录光的强度,不记录颜色。全靠上面那层 CFA(Color Filter Array)来区分红绿蓝。所以,Demosaic 做得好不好,直接决定了图像的细节锐度和色彩真实度。我见过不少项目,前期调了半天 AWB 和 CCM,结果 Demosaic 没调好,图像边缘全是锯齿和伪彩色,前功尽弃。

4.1 算法原理:从单通道到全彩的“猜字游戏”

Demosaic 本质上是一个插值问题。最常见的拜耳阵列是 RGGB 模式,也就是一个像素点只采集了 R、G、B 中的一种颜色。我们需要根据周围像素的信息,把缺失的另外两种颜色“猜”出来。

最简单的算法是双线性插值(Bilinear Interpolation)。比如要算一个红色像素点缺失的绿色值,就把它上下左右四个绿色像素的平均值拿过来用。这个方法速度快,但后果也很明显——边缘模糊,伪彩色严重。

稍微好一点的是边缘导向插值(Edge-Directed Interpolation)。它会先判断当前像素是在水平边缘还是垂直边缘上,然后只沿着边缘方向做插值,不跨过边缘。这样能保住一部分细节。

现在主流的高端 ISP 用的都是自适应插值,甚至结合了深度学习。但不管算法多复杂,核心思想就两个:

  • 绿色通道优先:因为拜耳阵列里绿色像素占了一半,人眼对绿色又最敏感,所以先插值绿色通道,再用绿色通道的信息去引导红色和蓝色的插值。
  • 梯度感知:计算水平和垂直方向的梯度,梯度小的方向就是边缘方向,沿着这个方向插值更安全。

核心公式(简化版):

假设我们在一个红色像素 R(i,j) 位置,要插值绿色 G(i,j):

// 计算水平和垂直梯度
Grad_H = |G(i,j-1) - G(i,j+1)|
Grad_V = |G(i-1,j) - G(i+1,j)|

// 如果水平梯度小,说明是水平边缘
if (Grad_H < Grad_V) {
    G(i,j) = (G(i,j-1) + G(i,j+1)) / 2
}
// 如果垂直梯度小,说明是垂直边缘
else if (Grad_V < Grad_H) {
    G(i,j) = (G(i-1,j) + G(i+1,j)) / 2
}
// 否则,取平均
else {
    G(i,j) = (G(i,j-1) + G(i,j+1) + G(i-1,j) + G(i+1,j)) / 4
}

嗯,这里要注意,实际工程里不会这么简单。梯度计算还要考虑颜色差异的连续性,也就是色差恒定假设(Color Difference Constancy)。

4.2 伪彩色抑制:那些不该出现的彩色噪点

伪彩色(False Color)是 Demosaic 最头疼的问题之一。你拍一张黑白条纹的测试卡,结果边缘出现了红红绿绿的杂色,这就是伪彩色。

为什么会这样?因为插值算法在图像的高频区域(比如纹理密集处、边缘处)会失效。它把不同通道的信息混在了一起,导致颜色通道之间出现了相位差。

我个人习惯把伪彩色分成两类:

  • 边缘伪彩色:出现在物体轮廓边缘,通常是一排红蓝交替的像素点。
  • 纹理伪彩色:出现在细密纹理区域,比如远处的砖墙、布料纹理,看起来像彩色摩尔纹。

抑制伪彩色的常用手段有几种:

  1. 色差平滑(Chroma Smoothing):在插值完成后,对色度通道(Cb、Cr)做低通滤波。但要注意力度,太强会把真实色彩也抹掉。
  2. 梯度修正:在插值过程中,如果检测到某个方向的梯度异常大,就降低该方向的权重,甚至改用其他方向的数据。
  3. 后处理去伪彩:专门做一个滤波器,检测局部区域的颜色突变。如果某个像素的颜色和周围差异太大,就把它拉回来。

我曾经踩过的坑:

有一次调试一个 4K 分辨率的 sensor,为了追求锐度,我把 Demosaic 的边缘增强参数调得很高。结果在拍摄红色 LED 灯牌时,灯牌边缘出现了一圈绿色的伪彩色。后来发现是色差平滑的强度不够,导致红色通道的过冲没有被抑制。最后我不得不降低边缘增益,同时增加色差平滑的半径,才把这个问题压下去。

所以,伪彩色抑制和边缘保护是一对天生的矛盾体,调参就是在走钢丝。

4.3 边缘保护参数调优:细节与噪声的博弈

边缘保护,说白了就是让图像的边缘更锐利,不要出现锯齿或模糊。但调得太狠,图像会显得“数码味”很重,甚至出现振铃(Ringing)和过冲(Overshoot)。

常见的边缘保护参数包括:

参数名称 作用 调大后果 调小后果
边缘阈值 (Edge Threshold) 判断一个像素是否属于边缘 更多区域被视为边缘,细节保留好,但噪声也可能被增强 边缘被平滑,图像变模糊
梯度增益 (Gradient Gain) 控制边缘方向的插值权重 边缘更锐利,但可能出现锯齿 边缘过渡更平滑,但细节丢失
色差平滑强度 (Chroma Smoothing Strength) 抑制伪彩色的力度 伪彩色减少,但色彩饱和度下降 色彩更鲜艳,但伪彩色增多
振铃抑制 (Ringing Suppression) 防止边缘出现黑白条纹 边缘更干净,但可能损失微对比度 边缘可能出现振铃,图像不自然

调优的时候,我一般会遵循这个流程:

  1. 先看测试卡:用 ISO 12233 分辨率测试卡,观察边缘的锯齿和伪彩色情况。
  2. 再拍实景:找一些纹理丰富的场景,比如树叶、布料、远处的建筑。看看有没有摩尔纹和伪彩色。
  3. 调整边缘阈值:从低到高逐步增加,观察边缘的锐度变化。找到一个平衡点——边缘清晰但不出现明显锯齿。
  4. 调整梯度增益:如果边缘还是不够锐,适当增加梯度增益。但要注意,增益太高会导致边缘出现“白边”或“黑边”。
  5. 最后调色差平滑:在保证边缘质量的前提下,尽量增加色差平滑强度,把伪彩色压下去。

我的调试小技巧:

在调试时,我会把图像放大到 200% 或 300%,专门盯着边缘区域看。同时打开 ISP 工具的“伪彩色显示模式”(如果有的话),把伪彩色区域高亮出来。这样能快速定位问题区域,不用凭感觉瞎猜。

4.4 知识结构图:Demosaic 调试全景

下面这张图总结了 Demosaic 调试的核心逻辑和参数关系,你可以把它当作调试时的路线图。

Demosaic 调试知识结构图 Demosaic 调试核心逻辑 Bayer RAW 输入 核心算法:边缘导向插值 梯度计算 → 方向选择 → 色差恒定 伪彩色抑制 边缘保护 色差平滑 梯度修正 边缘阈值 梯度增益 全彩 RGB 输出 调参核心:在伪彩色抑制与边缘保护之间寻找最佳平衡点 先调边缘阈值 → 再调梯度增益 → 最后调色差平滑

4.5 实战调参建议

最后,给几个实战中的调参建议,都是我用真金白银换来的经验:

  • 不要迷信单一参数:边缘阈值、梯度增益、色差平滑这三个参数是联动的。调一个,另外两个往往也要跟着动。
  • 注意 sensor 的噪声水平:高噪声的 sensor,边缘阈值要设得高一些,否则会把噪声当成边缘来增强,结果就是满屏噪点。
  • 分场景调优:室内人像和户外风景对 Demosaic 的要求完全不同。人像更看重色彩平滑,风景更看重边缘锐度。有条件的话,做多组参数配置,根据场景切换。
  • 用客观指标辅助:除了主观看图像,也可以看 MTF(调制传递函数)曲线和伪彩色面积占比。MTF 越高越好,伪彩色面积越小越好。

一句话总结:

Demosaic 调试,就是一场“细节”与“干净”的博弈。你想要的边缘越锐利,就要承受越多的伪彩色风险。反过来,伪彩色压得越干净,图像就越可能变糊。找到那个让客户满意的平衡点,就是你的本事。