4、去马赛克算法:双线性插值、自适应插值、AI去马赛克
好,咱们进入第四章。去马赛克,这名字听着有点玄乎,其实说白了,就是给每个像素补全颜色信息。
你想想看,CMOS传感器本身是色盲的,它只感知亮度。为了拍彩色照片,我们在传感器前面盖了一层滤色片阵列——最常见的就是Bayer阵列。每个像素只记录红、绿、蓝中的一种。那另外两种颜色去哪了?
去马赛克算法,就是根据周围像素,把缺失的颜色“猜”出来。我做了这么多年影像,可以负责任地告诉你:这一步做得好不好,直接决定你照片的锐度、噪点和伪色。很多新手觉得“反正RAW里数据全,后期随便拉”,其实不是的——去马赛克一旦做错,后期怎么救都救不回来。
4.1 Bayer阵列:一切的基础
先看一眼Bayer阵列长什么样。标准Bayer是RGGB模式,绿色像素占一半,红蓝各占四分之一。为什么绿色多?因为人眼对绿色最敏感。
| 像素位置 | R | G | B |
|---|---|---|---|
| (0,0) | R | G1 | — |
| (0,1) | — | G2 | B |
| (1,0) | — | G3 | B |
| (1,1) | R | G4 | — |
每个像素只有一个原始值。比如位置(0,0)只记录了红光强度,那这个像素的绿色和蓝色值就是0吗?当然不是。我们需要用周围像素去“猜”。
4.2 双线性插值:最朴素的方法
双线性插值,说白了就是“取平均值”。
比如你要算一个红色像素位置上的绿色值,那就把它上下左右四个绿色像素的值加起来除以4。蓝色也一样。简单粗暴,计算量极小。
代码实现也很直白:
// 伪代码:双线性插值去马赛克
for each pixel (x, y):
if pixel is Red:
G(x,y) = (G(x-1,y) + G(x+1,y) + G(x,y-1) + G(x,y+1)) / 4
B(x,y) = (B(x-1,y-1) + B(x+1,y-1) + B(x-1,y+1) + B(x+1,y+1)) / 4
else if pixel is Green:
R(x,y) = (R(x-1,y) + R(x+1,y)) / 2
B(x,y) = (B(x,y-1) + B(x,y+1)) / 2
else if pixel is Blue:
R(x,y) = (R(x-1,y-1) + R(x+1,y-1) + R(x-1,y+1) + R(x+1,y+1)) / 4
G(x,y) = (G(x-1,y) + G(x+1,y) + G(x,y-1) + G(x,y+1)) / 4
嗯,这里要注意:双线性插值最大的问题,是它假设颜色变化是平滑的。但真实世界哪有那么平滑?边缘、纹理、高反差区域,它全给你糊成一片。
4.3 自适应插值:聪明一点的方案
既然双线性太“傻”,那我们就让它变聪明一点。自适应插值的核心思路是:先判断当前像素是在平坦区域还是边缘区域,然后选择不同的插值方向。
举个例子。如果一个像素位于水平边缘上,那垂直方向的颜色变化很大,水平方向变化很小。这时候,我们应该优先用水平方向的像素来插值,而不是四个方向平均。
具体怎么做?
- 计算梯度:分别计算水平方向和垂直方向的梯度值。梯度越大,说明颜色变化越剧烈。
- 比较梯度:如果水平梯度小于垂直梯度,说明是水平边缘,用水平方向插值。反之亦然。
- 执行插值:根据选定的方向,只取该方向上的相邻像素做平均。
我个人的习惯是,在自适应插值里再加一个阈值判断。如果两个方向的梯度都很小,说明是平坦区域,那就退回到双线性插值。如果梯度都很大,说明是纹理复杂区域,那就用更保守的插值权重。
4.4 AI去马赛克:深度学习时代
到了2024年,AI去马赛克已经不是新鲜事了。它的思路完全不一样——不是“猜”,而是“学”。
我们准备大量成对的训练数据:左边是模拟Bayer阵列的RAW图,右边是原始全彩图。让神经网络自己去学习从马赛克到全彩的映射关系。
目前主流的网络结构是U-Net变体,带残差连接和注意力机制。输入是4通道(R、G1、G2、B),输出是3通道(R、G、B)。
// 简化的AI去马赛克网络结构
Input: Bayer RAW (4 channels)
↓
Conv2D(3x3, 64) + ReLU
↓
ResBlock × 4
↓
Attention Gate
↓
Conv2D(3x3, 3) + Sigmoid
↓
Output: RGB (3 channels)
AI去马赛克的好处很明显:
- 伪色几乎消失:网络学会了识别边缘和纹理,不会产生拉普拉斯伪影。
- 细节保留更好:在低光区域和高ISO下,AI能区分噪点和细节,不会把噪点放大成伪色。
- 自适应性强:同一个模型可以处理不同场景,不需要手动调参。
但缺点也有:
- 计算量巨大:在手机上跑一次AI去马赛克,可能需要几百毫秒,而双线性只要几毫秒。
- 需要训练数据:如果你用的是通用模型,在某些特殊场景(比如显微镜、天文摄影)下效果可能不如传统方法。
- 黑盒问题:你很难解释网络为什么在这个区域做了这样的插值。调试起来比较麻烦。
4.5 三种算法对比
我把三种算法的核心差异整理成了一张表,方便你选型时参考:
| 维度 | 双线性插值 | 自适应插值 | AI去马赛克 |
|---|---|---|---|
| 计算量 | 极低 | 中等 | 高 |
| 边缘质量 | 差(有伪色) | 良好 | 优秀 |
| 平坦区域 | 可接受 | 良好 | 优秀 |
| 低光表现 | 差(噪点放大) | 中等 | 优秀 |
| 可解释性 | 完全透明 | 可解释 | 黑盒 |
| 适用场景 | 预览、低功耗设备 | 中端相机、工业视觉 | 旗舰手机、专业相机 |
4.6 去马赛克流程总览
最后,我用一张SVG图把整个去马赛克的流程串起来。从Bayer RAW输入,到三种算法的分支,再到最终输出RGB全彩图。
从这张图可以看得很清楚:无论你选哪条路,最终目标都一样——把Bayer RAW变成RGB全彩图。区别在于,你愿意花多少计算资源,换取多少画质提升。