3、ISP Pipeline概览:ISP处理流程总览、各模块功能简介、RAW图到RGB/YUV的转换
好,咱们今天聊聊ISP的整个处理流程。说白了,ISP Pipeline就是一条“图像生产线”。RAW图从传感器出来,经过这条流水线,最终变成你屏幕上看到的漂亮照片。
我个人习惯把ISP Pipeline想象成一条“数据河流”。河水(RAW数据)从源头(传感器)出发,流经一个个“净化站”(各个处理模块),最后变成清澈的饮用水(RGB/YUV图像)。每个模块都有自己的任务,缺一不可。
3.1 ISP Pipeline整体流程
先看一张我画的流程图,帮你建立整体印象。
嗯,这张图基本涵盖了ISP的核心模块。你可能会问:“为什么模块顺序是这样?” 我告诉你,这个顺序是有讲究的。每个模块的输出,都是下一个模块的输入。顺序错了,效果就会大打折扣。
3.2 各模块功能简介
咱们一个一个来看。每个模块我都用一句话概括它的核心任务。
| 模块名称 | 英文缩写 | 一句话功能 |
|---|---|---|
| 黑电平校正 | BLC | 去掉传感器暗电流带来的固定偏移 |
| 去噪 | NR | 减少传感器和电路引入的随机噪声 |
| 去马赛克 | Demosaic | 从Bayer格式插值出完整的RGB图像 |
| 白平衡 | AWB | 让白色物体在任何光源下都呈现白色 |
| 伽马校正 | Gamma | 调整亮度曲线,适配显示设备 |
| 色彩校正 | CCM | 修正传感器色彩偏差,还原真实颜色 |
| 色彩空间转换 | CSC | 从RGB转换到YUV,便于压缩和传输 |
3.3 RAW图到RGB的转换
这是ISP Pipeline中最关键的一步。RAW图是什么?说白了,就是传感器直接输出的“原始数据”。每个像素只记录一种颜色(红、绿或蓝),按照Bayer模式排列。
举个例子,一个典型的Bayer模式是这样的:
R G R G R G
G B G B G B
R G R G R G
G B G B G B
你看,每个像素只有一种颜色信息。要得到完整的RGB图像,就需要“猜”出缺失的颜色。这个“猜”的过程,就是去马赛克(Demosaic)。
我在项目中遇到过一种情况:如果去马赛克算法太简单,比如直接用最近邻插值,图像边缘会出现明显的“锯齿”和“伪色”。嗯,这里要注意,好的去马赛克算法会考虑边缘方向,避免这些 artifacts。
一个简单的双线性插值算法示例:
// 假设当前像素是绿色位置,需要插值红色和蓝色
// 红色插值:取上下左右四个红色像素的平均值
R_interp = (R_top + R_bottom + R_left + R_right) / 4
// 蓝色插值:取对角四个蓝色像素的平均值
B_interp = (B_tl + B_tr + B_bl + B_br) / 4
当然,实际工程中不会用这么简单的方法。我建议你至少用“边缘导向插值”或者“自适应插值”。
3.4 RGB到YUV的转换
RGB到YUV的转换,说白了就是“换一种方式描述颜色”。RGB适合显示,YUV适合压缩和传输。
Y代表亮度,UV代表色度。人眼对亮度敏感,对色度不敏感。所以我们可以对UV分量进行下采样,压缩数据量,而人眼几乎察觉不到。
标准转换公式如下:
Y = 0.299 * R + 0.587 * G + 0.114 * B
U = -0.147 * R - 0.289 * G + 0.436 * B
V = 0.615 * R - 0.515 * G - 0.100 * B
你可能会问:“为什么系数是这些数字?” 这是根据人眼对红绿蓝三种颜色的敏感度来定的。人眼对绿色最敏感,所以G的权重最大(0.587)。对蓝色最不敏感,所以B的权重最小(0.114)。
3.5 避坑指南
我曾经在调试一个ISP Pipeline时,发现图像颜色总是偏绿。查了半天,原来是去马赛克模块的绿色通道插值算法有bug。嗯,这种问题最头疼,因为颜色偏绿可能是AWB的问题,也可能是Demosaic的问题,还可能是CCM的问题。
我的排查方法是:分阶段检查。先看RAW图有没有问题,再看Demosaic后的RGB图,最后看YUV输出。每个阶段都输出一张中间结果图,一眼就能看出问题出在哪。
好了,这一章的内容就到这里。ISP Pipeline的整体框架你已经了解了。下一章我们会深入每个模块的细节,从黑电平校正开始。