4、摄像头模组基础:Sensor工作原理、Bayer阵列与色彩滤波、RAW数据格式
做嵌入式视觉这些年,我接触过几十种摄像头模组。从最早的30万像素到现在的4800万像素,核心原理其实没变过。今天咱们就聊聊Sensor是怎么工作的,Bayer阵列到底是个啥,还有RAW数据为什么那么“原始”。
4.1 Sensor工作原理:从光子到电信号
说白了,图像传感器就是个光子计数器。每个像素点就像一个微型水桶,光子落进来,它就记个数。光越强,记的数越大。
目前主流的有两种:CCD和CMOS。我项目中用的基本都是CMOS,原因很简单——功耗低、成本低、集成度高。CCD虽然画质好,但现在已经很少在嵌入式领域看到了。
核心工作流程:
- 光电转换:光子打到感光二极管上,产生电子-空穴对
- 电荷积累:电子被收集在像素的势阱中,光越强电子越多
- 电荷读出:通过行选通和列选通,逐行读出每个像素的电压值
- 模数转换:ADC把模拟电压转换成数字信号,这就是RAW数据
嗯,这里要注意一个关键参数——满阱容量。它决定了每个像素最多能装多少电子。我在调试一款低照度摄像头时,发现暗部噪点特别多,后来查了手册才知道,那个Sensor的满阱容量只有8000e-,太小了。换了个满阱容量20000e-的Sensor,暗部表现立马好了很多。
4.2 Bayer阵列:为什么每个像素只感光一种颜色?
你可能会问:为什么Sensor不直接输出彩色图像?
原因很简单——单个像素没法区分颜色。它只能感知光的强度,不知道是红光、绿光还是蓝光。那怎么办?
Bryce Bayer在1976年想了个办法:在每个像素前面放一个彩色滤光片,只让特定颜色的光通过。这就是Bayer阵列。
Bayer阵列的典型排列:
RG/GB模式:第一行RGRG...,第二行GBGB...,交替排列。
绿色像素占了一半,红色和蓝色各占四分之一。为什么?因为人眼对绿色最敏感。
我曾经在一个项目中,为了省成本用了单色Sensor加外置滤光片轮,结果发现Bayer阵列的绿色像素占比高是有道理的——人眼对绿色细节的分辨能力最强。后来还是老老实实用了彩色Sensor。
4.3 色彩滤波:从单色到彩色的第一步
Bayer阵列只是第一步。每个像素只记录了某一种颜色的强度,那其他两种颜色怎么办?
这就引出了去马赛克(Demosaic)算法。说白了,就是根据周围像素的颜色值,插值计算出缺失的颜色信息。
举个例子:一个红色像素点,它只有R值。那它的G值和B值怎么来?
- G值:取周围4个绿色像素的平均值
- B值:取周围4个蓝色像素的平均值
当然,这只是最简单的双线性插值。实际项目中,我更喜欢用自适应插值算法,它能更好地保留边缘细节,避免出现彩色伪影。
注意:去马赛克算法会引入一定的图像失真。如果你做的是机器视觉应用(比如二维码识别、缺陷检测),建议直接用RAW数据做处理,跳过ISP的Demosaic步骤。我在做工业检测项目时就是这么干的,识别率提升了5%以上。
4.4 RAW数据格式:最原始的图像数据
RAW数据,就是Sensor直接输出的、未经任何处理的数字信号。它保留了最完整的图像信息。
常见的RAW格式有:
| 位深 | 数据范围 | 常见应用 |
|---|---|---|
| 8-bit | 0-255 | 低端摄像头、预览模式 |
| 10-bit | 0-1023 | 主流手机摄像头 |
| 12-bit | 0-4095 | 工业相机、高端安防 |
| 14-bit | 0-16383 | 专业摄影、科学成像 |
我个人习惯用10-bit RAW做嵌入式视觉。为什么?因为8-bit动态范围不够,12-bit又太占带宽。10-bit是个很好的折中。
来看一个实际的RAW数据读取示例:
// 假设Sensor输出10-bit RAW,Bayer模式为RGGB
// 每个像素占用2字节,低10位有效
uint16_t raw_data[WIDTH * HEIGHT];
// 从MIPI接口读取数据...
// 提取R、G、B通道
for (int y = 0; y < HEIGHT; y += 2) {
for (int x = 0; x < WIDTH; x += 2) {
uint16_t R = raw_data[y * WIDTH + x]; // (0,0) 红色
uint16_t G1 = raw_data[y * WIDTH + x + 1]; // (0,1) 绿色
uint16_t G2 = raw_data[(y+1) * WIDTH + x]; // (1,0) 绿色
uint16_t B = raw_data[(y+1) * WIDTH + x + 1]; // (1,1) 蓝色
// 处理每个通道...
}
}
避坑指南:我曾经在调试一款OV5640摄像头时,发现图像偏绿。查了半天,原来是Bayer顺序搞错了。Sensor手册上写的是BGGR,我默认用了RGGB。记住:不同厂商的Bayer顺序可能不同,一定要看数据手册确认。
4.5 知识体系总览
下面这张图,是我自己总结的摄像头模组核心知识框架。你可以把它当作一个快速索引:
这张图把四个核心知识点串起来了。你从Sensor工作原理开始,理解光子怎么变成数字信号;然后看Bayer阵列怎么安排颜色;接着是色彩滤波怎么补全颜色信息;最后落到RAW数据格式上——这是你真正要处理的东西。
我记得刚入行时,总觉得RAW数据就是“没处理好的图像”,后来才明白,恰恰相反——RAW数据才是最纯净的。你想想看,所有ISP处理(白平衡、伽马校正、降噪)都是在RAW数据上做的。如果你直接拿JPEG做图像分析,很多细节已经被压缩算法丢掉了。
好了,这一章的内容就到这里。理解Sensor工作原理、Bayer阵列和RAW数据格式,是后续所有图像处理的基础。下一章我们会聊聊MIPI CSI-2的物理层和协议层,到时候见。