0%

Camera-Pipeline

什么是ISP

主流的CMOS和CCD sensor几乎都是输出Bayer mosaic格式的RAW数据,这种数据格式是无法直接观看的,必须转换成常见的RGB或YUV格式才能被主流的图像处理软件支持。对于camera产品而言,一般还需要将RGB或YUV图像进一步转换成JPEG格式以方便进行存储。上述图像处理过程统称图像信号处理(Image Signal Processing,ISP),广义的ISP包含了JPEG和H.264/265图像压缩处理,而狭义的ISP仅包括从RAW格式变换到RGB或YUV的处理过程。

一个典型的ISP流水线由一系列处理模块组成,这些模块首尾相连,在几百MHz的时钟驱动下同时高速运转,图像数据不断从一个模块转移至下一个模块,直到完成所有的算法处理,最终以YUV或RGB的形式从流水线的末级流出ISP。下图所示的是一个支持常见基本功能的ISP流水线。

从图中可以看到,图像数据在ISP内部经历了两次颜色空间变换,第一次变换发生在Demosaic模块,它把像素从即RAW域变换到RGB域,第二次变换发生在CSC模块,它把像素从RGB变到YUV域。下表对ISP 各模块的作用给予了简要说明。

  • DPC(Defective Pixel Correction) 坏点矫正
    如果图像中存在坏点的话,在进行插值和滤波处理的时候,会影响周围的像素点,因此需要在插值和滤波之前对坏点进行校正。

    • 静态坏点校正:静态坏点的校正是基于已有的静态坏点表,比较当前点的坐标是否与静态坏点表中的某个坐标一致,若一致则判定为坏点,然后再计算校正结果对其进行校正。,每个sensor的坏点都不一样,需要sensor厂商给出每个sensor的静态坏点表。sensor的静态坏点表一旦写入存储,dpc模块会自动替换坏点表中所示坏点
    • 动态坏点校正:动态坏点的校正可以实时的检测和校正sensor 的亮点与暗点,并且校正的坏点个数不受限制
  • BLC(Black Level Compensation) 黑电平补偿 矫正
    黑电平(Black Level Correction):即黑色数据的最低电平值,通常指感光图像数据为0时对应的sensor信号电平值。其原因如下:

    • sensor厂家一般会在AD的输入之前加上一个固定的偏移量,使输出的pixel value在5(非固定)~255之间,目的是为了让暗部的细节完全保留
    • sensor的电路本身会存在暗电流 矫正方法:
    • 目前市场上使用的ISP一般采用的方法是在sensor输出的图像上减去一个固定数值
    • 利用黑电平随温度和gain的漂移曲线,利用一次函数的方式进行校正,但是对于不同sensor,漂移曲线不一样,因此该方案没有作为通用方案
  • LSC(Lens Shading Correction) 镜头矫正
    由于镜头的原因造成的暗角色散等现象需要对图像做一些矫正,后文再做详细介绍。

  • NR(Noise Reduction) 降噪
    raw域降噪,由于sensor输出的数据会存在各种噪声,而raw域是在偏靠近原始数据一端,在这个阶段做降噪可以减少噪声在后续算法中放大和传播,后文再做详细介绍。

  • AWB(Auto White Balance) 自动白平衡
    自动白平衡,监测环境光,尽可能还原物体本来的颜色,后文再做详细介绍。

  • Bayer Demosaic去马赛克
    raw数据只有在CFA下只有一个颜色的亮度信息,需要根据周围的颜色来差值得到RGB颜色,这是raw域最后一步,经过这一步图像就变成RGB域了。

  • Gamma 曲线校正
    sensor对光线的感知是线性的,而人眼对gamma的感知是非线性的,因此需要一个映射。其矫正方法如下:

    • LUT法: 提前把每个像素值经gamma矫正后对应的值求出来,然后把这些数据直接存储到一个数中,到矫正的时候根据输入的值就能直接通过数组下标就能找到对应的矫正后的值,这种方式最大的有点就时快,几乎不消耗硬件资源,因为几乎不用做任何计算的处理,但是这种方式的弊端在于需要大量的内存来存储这么这个表
    • 线性插值法: 线性插值法也很好理解,就是在gamma曲线上提取一些采样点,然后把采样点的输入输出作为xy存储起来,然后矫正的时候如果在采样点上就接直接输入矫正值,如果不在,那么肯定在某两个采样点之间,那么就可以就可以通过这两个采样点的线性方程求解出该点的校正值。但是这种方式会有一定的误差,因为线性方程并布恩那个完全拟合gamma曲线
  • CCM(Color Correction Matrix) 颜色校正
    由于人眼对色彩的感知曲线和sensor对色彩的感知曲线不同,为了更符合人类的视觉需要对sensor输出的色彩做一个映射,就是CCM模块做的事情。这个后文再做详细介绍。

  • CSC(Color Space Convert) 色彩空间转换
    颜色空间转换,很多算法需要基于YUV格式来做,且最重要的H264、H265编解码都是基于YUV格式的,ISP需要将图像由RGB域转YUV域,而该模块就是干这个事情的。

  • NR Luma(Noise Reduction forLuma) 亮度降噪
    对Y分量,也就是亮度信息做降噪处理,一般亮度越低信噪比越低。降噪方法一般就是两种在频域和空域里进行降噪,而常用的算法就是就是设计一个滤波窗口然后对图像进行卷积运算。

  • NR Chroma(Noise Reduction for Chroma) 色彩降噪
    对UV分量进行降噪处理,这里的噪声会造成色彩的波动,在亮度很低的情况下噪声会很大,造成色彩波动比较大。

  • Edge Enhance 边缘增强
    由于之前的域中会多次进行降噪处理,而降噪不可避免的会将图像中一些细节也捎带着消除了,导致图像模糊。为了将图像细节还原,减少图像损失,需要对其进行增强,但是不能再次引入噪声,就出现了Edge Enhance 边缘增强这类处理模块。边缘增强和我们日常说的锐化sharp是比较相似的。但是二者也有区别:锐化针对图像所有内容增加锐利度,边缘增强只是针对边缘,避免噪声也会锐化放大。后文再详细介绍。

  • Hue & Saturation 色调饱和度控制

    • 饱和度Saturation就是说色彩的鲜艳程度。在YUV域中,U、V分量分别代表蓝和红分量。当U=V=128的时候,表示饱和度为0;当|U-128|和|V-128|的值越大,饱和度也越大。当U、V分量的差值与系数s相乘,就可以调整饱和度幅度。s=0表示灰度,s=1表示原图不调整,0~1之间表示降低饱和度,大于1表示增加饱和度。
    • Hue的意思是色调、色相,表示颜色的相位角。简单理解就是,在一个标准圆中,红色是0°,绿色是120°、蓝色是240°,不同度数表示不同的颜色。后文再详细介绍。
  • Contrast & Brightness 对比度亮度控制

    • Brightness亮度控制是一般摄像头都会有的功能,顾名思义,就是控制亮度来改变图片效果
    • 对比度调节Contrast也叫做对比度增强Contrast Enhancement,就是增强图片的对比度。目前对比度增强主要的算法是直方图均衡化(Histogram),根据原始图像的亮度数据进行重新分布,使图片的亮度分布更加均匀 后文再详细介绍。

ISP输入图像的格式

目前主流的CMOS sensor几乎都是输出Bayer mosaic格式的RAW数据。Bayer格式图片是伊士曼·柯达公司科学家Bryce Bayer(1929 –2012)发明的,拜耳阵列被广泛运用与数字图像处理领域。

常用的Bayer格式有RGGB,、GRBG、GBRG等多种,因此需要正确配置ISP以反应sensor的数据格式。

RAW数据的精度常见有8/10/12/14bit等规格。安防监控行业较多使用10/12bit精度的sensor,医疗行业则主要使用12bit以上精度sensor,单反和广电行业则主要使用14bit精度sensor。对与一些带宽和存储资源特别紧张的场合,有些sensor会支持压缩表示以节约带宽RawCopmpress。

图像接入ISP的方式

  • 在线模式,online mode,sensor产生的实时数据和时序控制信号以行为单位送入ISP进行处理,具备低延迟(low latency)的优点
  • 离线模式,offline mode,待处理的图像以帧为单位存储于系统内存,需要处理时由一个控制逻辑通过DMA从内存中读取数据,并添加模拟sensor行为的时序控制信号,然后送给ISP进行处理

行缓冲 Line Buffer

不论是在线模式还是离线模式,ISP处理图像都是以行为单位的,所以ISP模块都会设计一个line buffer可以缓存若干行图像。通常这个line buffer的大小就决定了这个ISP所支持的最大分辨率。举例来说,如果一个ISP的line buffer可以容纳每行2048个像素,则它无法支持超过2k/1080p的分辨率规格。

数据对齐 Alignment

ISP、CODEC等硬件单元在处理图像时通常都会有粒度(granularity)要求,即必须将8/16/32/64/128个像素作为一组来处理,这样就可以通过硬件并行化来提高吞吐率。这个需求称为ISP的数据对齐(alignment)需求,多数sensor都支持一个linesize属性,以保证sensor输出的每行数据的宽度符合ISP的对齐要求。

图像压缩

4K分辨率的图像有800W个像素,RAW格式占1600W字节,YUV422格式占1200W字节,8K分辨率,也就是7680x4320,RAW格式占6600W字节。

为了减轻传输带宽和存储的压力,支持4K 以上的芯片都会在DMA上设计一个压缩算法。当DMA向内存中写入数据时,实际进入内存的是压缩后的数据。当DMA从内存中读取数据时,用户得到的是解压缩后的数据。

Arm 出售的图像压缩技术叫AFBC,即Arm Frame Buffer Compression,这是一种基于脉冲编码调制(Pulse Code Modulation,PCM) 技术实现的无损压缩技术,典型情况下可以实现50% 左右的压缩率,可以节省存储空间和传输带宽。

色调映射 Tone Mapping

摄像机拍摄室外场景时,晴朗夏天的光照度可以达到10万~20万lux,理论上拍摄这种场景需要提供高达5000:1的动态范围,在摄像机内部则需要使用至少13位的数据才能表示5000:1的动态范围,在通用 CPU架构中使用16位整数则更加方便。由于数据在处理环节经常涉及除法、开方、指数等浮点运算,所以还需要预留若干个小数位以保持浮点精度,4位二进制小数可以提供0.0625精度,8位二进制小数可以提供0.0039精度。上述的主流ISP方案中使用20位数据。

当图像在显示设备上输出时,普通的LDR显示器只能提供256级灰度,按数量级是100:1的动态范围。符合HDR10标准的显示器可以提供1000:1的动态范围,已经可以较好地还原自然场景的动态。如果摄像机的适配输出设备是LDR显示器,则摄像机的ISP内部需要完成从5000:1到100:1的动态范围压缩。

当WDR模块完成多帧合成(frame stitch)后,接下来就需要对数据位宽进行压缩以节约后续步骤的计算资源。比较合理的做法是采取逐级压缩策略,比如在WDR模块先压缩到12位精度,经过CCM、Gamma 等颜色处理后进一步压缩到10位精度,经过CSC模块后进行最后一次压缩得到最终的8位精度输出。

从16/20位精度压缩到12位精度的过程称为色调映射,这一步骤的主要任务是压缩图像的动态范围,将HDR图像映射到LDR图像,并尽量保证图像细节不损失。

色调映射的方法大致分为两类 ,即全局算法和局部算法。

全局算法(Global Tone Mapping,GTM)

全局算法可以理解为每幅图像有一个颜色映射表,GTM算法通过查表的方法把一个输入颜色映射为一个输出颜色。有些算法对所有图像都使用固定的表,有些算法则是针对每一帧图像创建不同的表。

GTM算法特点 :

  • 任意相同颜色的像素点,在映射后,还是相同的颜色
  • 全局算法一般较简单,速度快
  • 全局算法的性能一般劣于局部方法

存在算法 : 直方图均衡化、Gamma、对数校正、直方图规定化、分段灰度变换

一种基于Gamma的算法叫做Academy Color Encoding System(ACES),它由美国电影艺术与科学学会提出,有人认为这是目前最好的一种GTM算法。ACES 本质上是一个通用的数据交换格式,既可以把不同的输入设备转成ACES,也可以把ACES在不同的显示设备上正确地显示。不管是LDR还是HDR都可以在ACES里表达出来。ACES的转换曲线如下图所示。

局部算法(Local Tone Mapping,LTM)

人眼的感知特性具有局部性特点,举例来说,在普通人眼看来下图中的A色块的亮度明显低于B色块的亮度。而事实真相是,这两个色块的真实像素亮度是一模一样的,人眼感觉B更亮,主要是因为B的周围是暗色块,而A的周围是亮色块,人的知觉系统针对这种场景自动做了对比度提升。

这种现象在总体上可以归结为人的知觉恒常特性,具体地说就是亮度恒常特性。下图是另外一个亮度恒常的例子。在这个例子中,所有小灰色块的真实亮度都是一样的,但是如果周围环绕的颜色不同,人对灰色块的颜色知觉也不相同。

局部算法借鉴了人眼的知觉原理,在映射一个像素时,不仅考虑该像素的绝对值,还会考虑该像素周围区域的平均亮度值,将对比度大的像素映射为高亮,对比度小的像素映射为低亮,往往可以取得更好的效果。

LTM算法特点 :

  • 映射前颜色相同的像素点,映射后颜色可能不同
  • 局部算法一般较全局方法更复杂,速度相对较慢
  • 局部算法的性能一般优于全局方法
  • 会出现光晕等现象

存在算法 : 分块中值直方图,基于Retinex原理的算法等

参考文献

https://zhuanlan.zhihu.com/p/98820927
https://zhuanlan.zhihu.com/p/397813417