图像信号处理流程 (ISP Pipeline)
这是我总结的流程,不同 ISP 可能会有差异,但大致上是类似的。
- DPC: Dead Pixel Correction
- BLC: Black Level Correction
- DSNU: Dark-Signal Non-Uniformity Correction
- PRNU: Photo-Response Non-Uniformity Correction
- LSC: Lens Shading Correction
- Raw Denoise: Raw Noise Reduction, Bayer Noise Reduction
- CAC: Chromatic Aberration Correction
- AWB: Auto White Balance
- Demosaic: Demosaicing
- LDC: Lens Distortion Correction
- RGB Denoise: Denoising
- CCM: Color Correction Matrix
- Gamma: Gamma Correction
- Post-Processing
- Sharpening
- Denoise
- Depurple, False Color Suppression
- Hue/Saturation Adjustment
表格说明
这是简单的表格说明,更具体的在下方说明,并且对应文件夹有更细节的说明。
| 步骤 | 模块名称 | 说明 |
|---|---|---|
| DPC | Dead Pixel Correction | 坏点校正 |
| BLC | Black Level Correction | 黑电平校正,通常是所有同类型像素减去一个固定值 |
| DSNU | Dark-Signal Non-Uniformity | 暗场非均匀性校正,这个则是针对每个像素减去一个自身对应的值 |
| PRNU | Photo-Response Non-Uniformity | 光响应非均匀性校正,每个像素乘以一个系数进行校正,基本和下面的 LSC 合并去做 |
| LSC | Lens Shading Correction | 镜头光照不均匀校正,每个像素乘以一个系数进行校正,基本和上面 PRNU 合并去做 |
| Raw Denoise | Raw Noise Reduction | 在 RAW 阶段进行降噪,有时也叫 BNR (Bayer Noise Reduction) |
| CAC | Chromatic Aberration Correction | 色差校正 |
| AWB | Auto White Balance | 自动白平衡 |
| Demosaic | Demosaicing | 从 Bayer 格式转换为 RGB 格式 |
| LDC | Lens Distortion Correction | 畸变校正 |
| RGB Denoise | Denoising | 在 RGB 阶段进行降噪 |
| CCM | Color Correction Matrix | 颜色校正矩阵 |
| Gamma | Gamma Correction | 伽马校正 |
| Post-Processing | Post-Processing | 包括锐化、伪彩抑制(去紫边)、色调/饱和度调整、更复杂的降噪等 |
01. DPC: Dead Pixel Correction
坏点校正。坏点一般分为两种类型:像素值固定比较大/小,或者像素值感光线性度和其他像素差异很大。
算法有 SDPC(静态校正)和 DPC;算法主要是两个重点:检测和修复;其中检测是比较重要的,修复则没啥特别标新立异的方法,因为 DPC 一般都是独立点或者很小的点簇(如果有一个 4x4 的坏点,厂商就有极大可能作为不良品不出货了),所以很小的点一般都是用周围点均值或者中值替代,无非是有的方法简单判断边缘,只用对应方向的点来修复。
02. BLC: Black Level Correction
这里的黑电平是统一减去一个固定值,如果是 Bayer 那么就 RGGB 四种类型的像素各自减去不同的固定值,和 DSNU 不一样,这一定要明白。这个也通常叫做 OB。
03. DSNU: Dark-Signal Non-Uniformity Correction
暗场非均匀性校正,很重要的一个步骤。做 DSNU 标定就是遮黑采图就可以了。
上面的 BLC 来源是 ADC 偏置、模拟前端偏置等造成的全局偏移,而 DSNU 则是每个像素点的局部偏移,所以 DSNU 是每个像素点减去一个对应的值。而且 DSNU 减去的值不同曝光时间不同,比如标定是在 100ms 曝光下做的,那么在 10ms 下拍摄的图像就需要把 DSNU 值乘以 0.1 再去减。
有的相机甚至是温度也是作为一个参数,不同温度下减去不同的 DSNU 值。我做过一个项目就是这样的,温度插值。很不容易,写自动化脚本、让温度更加精准等,但是最后的确效果卓群,很不错的一个产品。
04. PRNU: Photo-Response Non-Uniformity Correction
也是很重要的一个步骤,也是之前搞过很长时间的一个项目.... 项目细节暂时就不说了,最后效果非常好,甚至有点出乎意料的好。
05. LSC: Lens Shading Correction
PRNU 和 LSC 在工程上都是合并在一起的。这个乍一想听困惑的:LSC 和镜头强相关,PRNU 和芯片强相关,为什么要合并?
好处不用多说,省资源;坏处是灵活性下降。但其实细细想想,并不会牺牲灵活性。首先对于手机而言,镜头基本不换,所以两个绑在一起也无妨;那如果是相机呢?其实也没问题,如果 LSC 和 PRNU 分开:我们换镜头的时候,还是要重新标定 LSC 生成一组新的参数。如果不分开也是一样的,换镜头重新标定的时候,顺带着把 PRNU 参数乘上就行了,和分开时候的步骤是一样的。
06. Raw Denoise: Raw Noise Reduction
Raw 域上的降噪,没啥好说的。
07. CAC: Chromatic Aberration Correction
色差校正,通常是在 RAW 阶段进行,原因是此时 RGB 通道是分开的,可以更精确地进行校正。而如果 Demosaic 之后再做:通道已经混合,校正精度则下降。
而与之相反,畸变校正,通常是 RGB 阶段才做,因为在 RAW 上做会导致马赛克错位,验证影响 Demosaic 效果。
08. AWB: Auto White Balance
AWB 在 RAW 阶段做还是 RGB 阶段做?
白平衡校正,做的时候是在 RAW 阶段,此时 RGB 通道是分开的,而 AWB 本来要做的事情就是把 RGB 三个通道拉到同一水平线上,所以在 RAW 阶段做更合适。
但是用来白平衡校正的系数可能会在 RGB 阶段去计算。如果是简单的白平衡算法,比如统计 RGB 平均值等等,这个直接在 RAW 上算也能算出来。但是现在很多都是基于 AI 来判断场景从而给出 AWB 系数的,这种在 RGB 去算系数会更准确一些。
AWB 和 CAC 的顺序
AWB 和 CAC 其实顺序并不严格,通常是先做 CAC 再做 AWB,因为 CAC 如果校正完美了,那对 AWB 模块也有好处。
09. Demosaic: Demosaicing
从 Bayer 格式转换为 RGB 格式,之前花了很长很长时间在这个上面...
10. LDC: Lens Distortion Correction
畸变校正,在 Demosaic 之后就可以做了,也就是得到了完整的 RGB 图,就可以做畸变校正了,因为本质上就是 (x,y)->(x',y') 的坐标变换。至于究竟在哪个模块之后做,不同 ISP 有不同的实现。
而且做的时候可以尝试不同的模型,之前用过鱼眼镜头,那是另一种畸变模型,和普通的广角镜头的畸变模型不太一样。做的时候也要弄清楚转换前后的坐标,不要搞反了。
11. RGB Denoise: Denoising
转到 RGB 阶段之后的降噪,可以用更复杂的算法,因为此时三个通道信息都齐全了。
12. CCM: Color Correction Matrix
颜色校正矩阵,把 RGB 空间映射到另一个 RGB 空间,通常是为了让颜色更加准确。一般就是拍色卡,然后用 Imatest 标定就行。