1. 从Bayer阵列到Demosaicking:为什么我们需要它
当你用手机拍下一张照片时,你可能不知道相机传感器看到的原始数据其实是一张"不完整"的图像。这要从Bayer阵列说起——这种由红绿蓝滤光片交替排列的传感器设计,是几乎所有数码相机的核心。我拆解过十几款手机摄像头模组,发现它们的传感器表面都覆盖着这种像棋盘格一样的彩色滤镜。
Bayer阵列的精妙之处在于它用单层传感器就实现了彩色成像。绿色滤光片数量是红蓝的两倍,这模仿了人眼对绿光更敏感的特性。但这也带来一个问题:每个像素点只能记录一种颜色信息。比如一个被红色滤光片覆盖的像素,它只知道这个点的红色强度,对绿色和蓝色一无所知。这就好比用三支不同颜色的笔交替画图,每支笔都只画了1/3的图案。
Demosaicking算法就是用来解决这个问题的"图像修复师"。早期的线性插值法就像用相邻几个点的颜色平均值来填空,虽然简单但会产生明显的伪色和锯齿。我做过一个实验:用5款不同价位的手机拍摄同一张测试卡,在放大200%后,千元机出现的彩色噪点明显比旗舰机多,这就是Demosaicking算法差异导致的。
2. 线性插值:Demosaicking的启蒙时代
2.1 双线性插值的实现原理
最早的Demosaicking算法简单得令人惊讶——它就是取相邻像素的平均值。对于RGGB排列的Bayer图像(这是最常见的格式),算法处理逻辑是这样的:
- 对于红色像素点(如R1位置):直接保留红色值,绿色值取上下左右四个相邻绿色点的平均值,蓝色值取四个对角蓝色点的平均值
- 对于绿色像素点:如果在红色行(Gr),就水平方向取红色平均值,垂直方向取蓝色平均值
用Python实现的话,核心代码大概是这样:
def bilinear_demosaic(bayer):
height, width = bayer.shape
rgb = np.zeros((height, width, 3))
# 红色像素处理
rgb[1::2, 1::2


4260

被折叠的 条评论
为什么被折叠?



