Image Signal Processor - yubo105139/paper GitHub Wiki
Image Signal Processor
介绍
图像信号处理器 (ISP) 是一种用于进行数字图像处理的应用处理器,专门用于从 RAW 图像(从成像传感器获取)到 RGB/YUV 图像的转换(进一步处理或显示)。

ISP Pipeline

Bayer Domain 处理
坏点矫正
坏点简介
从传感器制造的角度来看,由于制造过程的不确定性,例如灰尘、制造缺陷、曝光未完成等,图像传感器可能存在一定程度的缺陷像素。换句话说,出现缺陷像素的几率仅取决于在制造工艺,最终无法避免,但可以尽可能消除。
坏点校正的目的就是修复这类问题,通常坏点分为以下两种:
(1) 静态坏点:分为静态亮点和静态暗点。
静态亮点:一般来说像素点的亮度值是正比于入射光的,而亮点的亮度值明显大于入射光乘以相应比例,并且随着曝光时间的增加,该点的亮度会显著增加;
静态坏点:无论在什么入射光下,该点的值接近于0;
(2) 动态坏点:在一定像素范围内,该点表现正常,而超过这一范围,该点表现的比周围像素要亮。与sensor 温度、增益有关,sensor 温度升高或者gain 值增大时,动态坏点会变的更加明显;
坏点校正原因
在图像处理的过程中需要做坏点校正,而且坏点校正(DPC)通常在ISP的pipeline靠前位置的主要有如下原因:
(1) 如果图像中存在坏点的话,ISP后续进行插值和滤波处理时,会影响周围的像素点值,因此需要在插值和滤波之前对坏点进行校正 ;
(2) 图像存在坏点比较多或动态坏点很多的情况下,会造成图像的边缘出现伪色彩的情况,这种现象不但影响图像的清晰度,而且会影响边缘的色彩;
(3) 坏点也会造成图像部分pixel闪烁的现象;
坏点校正策略
实现坏点校正功能有两个步骤。 第一步是检测有缺陷的像素,第二步是用插值替换缺陷

对于静态的缺陷,通过显示黑色或白色图像很容易找到位置。 然后将已知缺陷的位置存储到 ISP 存储器中进行修正。
对于动态缺陷,通常使用缺陷像素的邻域来估计。

计算中心像素和相邻的 8 个像素之间的差异。

根据预设的阈值 thres 来对像素是否为坏点。

一旦完成自动坏点检测,就可以执行校正。这里列出了两种插值方法。一种是均值滤波器,另一种是基于梯度的滤波器。
均值滤波:

梯度滤波:对于基于梯度的滤波器,首先计算不同方向上相邻像素的梯度。

从上图中,计算出四个方向的梯度:

输出像素是所选方向上相邻像素的平均值。

黑电平补偿
黑电平简介
黑电平(Black Level Correction):即黑色数据的最低电平值,通常指感光图像数据为0时对应的sensor信号电平值。黑电平形成的原因有多种,主要的形成原因如下面两点:
(1) CMOS传感器采集的信息经过一系列转换生成原始RAW格式数据。以8bit数据为例,单个pixel的有效值是0~255,但是实际AD芯片(模数转换芯片)的精度可能无法将电压值很小的一部分转换出来,因此,sensor厂家一般会在AD的输入之前加上一个固定的偏移量,使输出的pixel value在5(非固定)~255之间,目的是为了让暗部的细节完全保留,当然同时也会损失一些亮部细节,由于对于图像来说,我们的关注度更倾向于暗部区域,ISP后面会有很多增益模块(LSC、AWB、Gamma等),因此亮区的一点点损失是可以接受的。
(2) sensor的电路本身会存在暗电流,导致在没有光线照射的时候,像素单位也有一定的输出电压,暗电流这个东西跟曝光时间和gain都有关系,不同的位置也是不一样的。因此在gain增大的时候,电路的增益增大,暗电流也会增强,因此很多ISP会选择在不同gain下减去不同的bl的值。
如多sensor输出raw数据中附加的黑电平值,需要在ISP最前端去干净。如果不去干净,干扰信息会影响后端ISP各模块的处理,尤其会导致AWB容易不准,出现画面整体偏绿或偏红现象。
黑电平校正算法
一般BLC模块会放在ISP比较靠前的位置,因为我们希望图像在进入其他模块之前能够还原最为真实的图像。有些sensor会在sensor内部集成BLC的模块,那么此时ISP里的BLC模块只做微调即可。调整算法如下:

其中是R_offset、α、β等为可配置的参数。
镜头阴影校正
镜头阴影介绍
镜头阴影校正(Lens Shading Correction)是为了解决由于lens的光学特性,由于镜头对于光学折射不均匀导致的镜头周围出现阴影的情况。镜头阴影会导致两种阴影,亮度阴影和颜色阴影。
luma shading
Luma Shading原因有两个,第一,由于镜头本身就是一个凸透镜,Lens的光学特性——凸透镜原理,中心的感光必然比周边多,通光量从中心到边角依次较少,导致图像中间亮,四周偏暗;第二,当Lens CRA(主光线角度,Chief ray angle)大于 Sensor CRA(microlens)导致sensor传感器边缘像素收集光能衰减更大(CRA矫正改善),因此导致传感器中心像素收集光能大于边缘像素,加剧Luma Shading。

chroma/color shading
由于各种颜色的波长不同,经过了透镜的折射,折射的角度也不一样,Luma Shading的第二个原因是color shading主要原因。

镜头阴影矫正算法
Shading的矫正方法目前主流有两种:一种是同心圆法,一种是网格法。
同心圆法的流程为:
1.找到RGB三通道的圆心(一般选择为同一个点)
2.以同心圆的形状将画面的中心和画面的边缘的三通道乘以不同的增益
具体如下图所示,一般来说考虑shading渐变的曲率从中心到边缘逐渐增大,所以等增益曲线中心稀疏,边缘密集。一般来说lens shading的增益最好不要超过2倍,因为会引入噪声。

下图为mesh shading的矫正方法,同一个方格中的增益一致,mesh的分布也是中心稀疏四角密集。

同心圆矫正方法的优点是计算量小,缺点是镜头若装配时稍有不对称则矫正失败;网格矫正方法的优点是能够应对各种shanding情况,缺点是运算量大。
自动白平衡(auto white balance )
自动白平衡介绍
白平衡 (WB) 是消除不真实的色偏的过程,确保人眼中看起来是白色的物体在照片中呈现白色。 适合的相机白平衡必须考虑光源的“色温”,即白光的相对暖度或冷度。 我们的眼睛非常擅长在不同光源下判断什么是白色,但数码相机在自动白平衡 (AWB) 方面往往有很大的困难。自动白平衡主要解决图像偏色的问题,如果图像偏色,我们就可以用自动白平衡算法给矫正过来。

不同色温下的图像。

要实现自动白平衡功能,需要估计色温。 不同色温下,增益不同,需视情况计算。 色温的估计很复杂,由软件或固件完成。
自动白平衡算法
做白平衡算法的基本过程其实就是在每个颜色通道上乘上对于的gain值,如下图所示:

所以关键的步骤就是如何去确定这些gain值。因为gains值的估计是一个under constrained问题,因此经常使用强假设来解决,如灰度世界假设、白世界假设等。接下来我们将介绍几种常见的白平衡算法。
-
灰度世界法
灰度世界假设认为:给定一个颜色丰富的图像,那么其中各个颜色的平均值应该是灰色。因此,不同颜色通道上的平均测量值中灰色的偏移就是由于光源的颜色造成的,而上述公式中的(rg,gg,bg)就是用来补偿这种偏移的。那么假设每个颜色通道的均值为 (R avg ,G avg ,B avg )。则对应的(rg,gg,bg)就等于:

其中R gray = G gray = B gray,也就是一般用来表示灰色的颜色值,如八位图值的128. 这种算法适用于很多场景,但是当拍摄的对象和颜色较为单一时,效果则不够理想。
-
最大亮点法
最大亮度法则是假定图像中某些点对各个频率的色光具有最大的反射率,即认为亮度最大的点(一般认为R+G+B或Y最大)为白色点,并以该点为参考点进行AWB算法。此时(rg,gg,bg)等于:

其中 R white = G white = B white 是白色点对应的颜色值, R max = G max = B max 则是该图像最亮点的三颜色值。这种算法也适用于很多场景,但是会被像诸如噪点、HDR等影响,这时鲁棒性就不够理想。基于这些算法应用时的局限性,为了加强假设,限制系统失真和白平衡估计之间的相互影响,接下来将介绍一些更复杂的白平衡算法。
-
区域分割法
该算法会预先在各个色温下(2500~7500K)拍几张白纸照片,假设拍6张(2500,3500…7500),作为色温参考表,然后根据这些数据插值出各个色温下的对应数据,如R/G,B/G。
接下来会将整个图像分为M*N个block,并统计每一个block的信息,如白色像素的数量及R/G/B通道的分量的均值。根据这些统计值, 就找出图像中所有白色的block,并根据拟合的色温曲线来判断该block的色温。最后只需要统计在所有白色block中色温最多的那个即可。
最后其实AWB算法还有很多,如色域界限法,完美反射法等等,这里不多做赘述。AWB在isp pipeline中属于color rendition部分,对于成像画质的影响比较大,因此一般在后续还会有AWB tunning的过程来进一步改善整体的成像效果。
颜色插值
颜色插值简介

当光线通过 Bayer型 CFA(Color Filter Arrays) 阵列之后, 光线打在传感器上,分别得到了BGR数据,在这里,BGR的数据采样比为1:2:1,是因为人眼对绿色光(550nm)更为敏感,其中G也称作亮度信息,BR为色度信息。可以看出,在上面的Bayer图中,每一个pixel都只有BGR数据中的一个,所以就需要利用CIP插值来补充其他两个通道的颜色信息。才能形成一幅正常的全彩色image。
插值算法
插值一般遵循以下几个原则: 1.先对G分量进行插值,因为G的像素个数是GB的两倍 2.插值时采用方向性插值,即如果是垂直的边缘,则采用上下的像素进行插值,而不选用左右 3.Hamilton提出的patent奠定了基础,基本原理就是色差恒定,即相邻点的R(i,j)-G(i,j) = R(i, j+1)-G(i, j+1)

a.先获取图像中的物体的边缘 b.根据边缘信息重建G分量 c.根据哈密尔顿提出的色差恒定理论,重建R和B d.一些后处理,包括伪彩色抑制和zipper cancelling等
- Nearest Neighbor Replication
每个插值输出像素被分配输入图像中最近像素的值。 最近的邻居可以是上,下,左和右像素中的任何一个。下面的示例在图2中以绿色平面中的3x3块为例。 在这里,我们假设左侧的相邻像素值用于填充缺失的像素值。

-
Bilinear Interpolation
绿色像素插值:将上,下,左和右像素值的平均值指定为插值像素的G值。 例如:G8 =(G3 + G7 + G9 + G13)/ 4.

红色/蓝色像素在绿色位置的插值:将对应颜色的两个相邻像素值的平均值分配给插值像素。 例如:B7 =(B6 + B8)/ 2; R7 =(R2 + R12)/ 2 红色/蓝色像素在蓝色/红色位置的插值:将四个相邻对角像素值的平均值分配给该插值像素。 例如:R8 =(R2 + R4 + R12 + R14)/ 4; B12 =(B6 + B8 + B16 + B18)/ 4
RGB域处理
Gamma 矫正
假设图像中有一个像素,值是 200 ,那么对这个像素进行校正必须执行如下步骤:
1. 归一化 :将像素值转换为 0 ~ 1 之间的实数。 算法如下 : ( i + 0. 5)/256 这里包含 1 个除法和 1 个加法操作。对于像素 A 而言 , 其对应的归一化值为 0. 783203 。
2. 预补偿 :根据公式 , 求出像素归一化后的 数据以 1 /gamma 为指数的对应值。这一步包含一个 求指数运算。若 gamma 值为 2. 2 , 则 1 /gamma 为 0. 454545 , 对归一化后的 A 值进行预补偿的结果就 是 0. 783203 ^0. 454545 = 0. 894872 。
3. 反归一化 :将经过预补偿的实数值反变换为 0 ~ 255 之间的整数值。具体算法为 : f*256 - 0. 5 此步骤包含一个乘法和一个减法运算。续前 例 , 将 A 的预补偿结果 0. 894872 代入上式 , 得到 A 预补偿后对应的像素值为 228 , 这个 228 就是最后送 入显示器的数据。
如上所述如果直接按公式编程的话,假设图像的分辨率为 800*600 ,对它进行 gamma 校正,需要执行 48 万个浮点数乘法、除法和指数运算。效率太低,根本达不到实时的效果。
针对上述情况,提出了一种快速算法,如果能够确知图像的像素取值范围 , 例如 , 0 ~ 255 之间的整数 , 则图像中任何一个像素值只能 是 0 到 255 这 256 个整数中的某一个 ; 在 gamma 值 已知的情况下 ,0 ~ 255 之间的任一整数 , 经过“归一 化、预补偿、反归一化”操作后 , 所对应的结果是唯一的 , 并且也落在 0 ~ 255 这个范围内。
如前例 , 已知 gamma 值为 2. 2 , 像素 A 的原始值是 200 , 就可求得 经 gamma 校正后 A 对应的预补偿值为 228 。基于上述原理 , 我们只需为 0 ~ 255 之间的每个整数执行一次预补偿操作 , 将其对应的预补偿值存入一个预先建立的 gamma 校正查找表 (LUT:Look Up Table) , 就可以使用该表对任何像素值在 0 ~ 255 之 间的图像进行 gamma 校正。

颜色校正矩阵(CCM)
色彩校正原理
人眼对色彩的识别,是基于人眼对光谱存在三种不同的感应单元,不同的感应单元对不同波段的光有不同的响应曲线的原理,通过大脑的合成得到色彩的感知。 一般来说,我们可以通俗的用 RGB三基色的概念来理解颜色的分解和合成。理论上,如果人眼和 sensor 对光谱的色光的响应,在光谱上的体现如下的话,基本上对三色光的响应,相互之间不会发生影响,没有所谓的交叉效应。理想R/G/B光谱响应如下:

而实际人眼对R/G/B的光谱响应如下,RGB的响应并不是完全独立的。

某款相机的sensor光谱响应曲线如下:

从上图可以看出,sensor的R/G/B响应曲线和人眼的R/G/B响应曲线是不一致的。而且图像数据经过ISP的AWB处理之后肯定会存在色偏,因此需要RGB域进行色彩矩阵校正。
色彩校正策略
我们已看到 sensor 对光谱的响应,在 RGB各分量上与人眼对光谱的响应通常是有偏差的,当然就需要对其进行校正。不光是在交叉效应上,同样对色彩各分量的响应强度也需要校正。通常的做法是通过一个色彩校正矩阵对颜色进行一次校正。校正矩阵如下:

该色彩校正的运算通常由 ISP 完成,软件通过修改相关寄存器得到正确的校正结果。另外随着色温的升高,要对色温进行较正,否则,物体在这样的光线条件下所表现出来的颜色就会偏离其正常的颜色,因此需要降低 sensor 对红色的增益,增加 sersor 对蓝光的增益。因此,建议做CCM矩阵时选取不同的色温生成不同的CCM矩阵,然后根据实际色温值插值得到当前色温的CCM矩阵。
色彩空间转换
在现代彩色电视系统中,通常采用三管彩色摄像机或彩色CCD摄像机进行摄像,然后把摄得的彩色图像信号经分色、分别放大校正后得到RGB,再经过矩阵变换电路得到亮度信号Y和两个色差信号R-Y(即Cr)、B-Y(即Cb),最后发送端将亮度和色差三个信号分别进行编码,用同一信道发送出去。这种色彩的表示方法就是所谓的YCbCr色彩空间表示。采用YCbCr色彩空间的重要性是它的亮度信号Y和色度信号Cb、Cr是分离的。如果只有Y信号分量而没有U、V分量,那么这样表示的图像就是黑白灰度图像。彩色电视采用YUV空间正是为了用亮度信号Y解决彩色电视机与黑白电视机的兼容问题,使黑白电视机也能接收彩色电视信号,保证了信道兼容性。
CSC(color space convert):RGB与YCbCr颜色空间的转换,常用的色域空间有BT.601(SDTV,标清电视),BT.709(HDTV,高清电视),BT.2020(UHDTV,超高清电视),在不同的色域空间下,转换矩阵是不一致的。
色域表示显示设备能够显示的颜色范围,下图中马蹄形区域为人眼能看到的色彩区域,BT.601是标清视频使用的色域范围,BT.709和BT.2020分别对应高清和超高清视频的色域。

CSC转换
BT.601color space 转换

BT.709 color space 转换

BT.2020 color space 转换

YUV Domain 处理
边缘增强
边缘增强是一种图像处理过滤器,用于增强图像的边缘对比度或试图提高其锐度(表观清晰度)的视频。 过滤器的工作原理是识别图像中的锐利边缘边界,例如主体和背景之间的边缘 对比色,并增加边缘周围区域的图像对比度。
一般使用反锐化掩膜Unsharp Masking增强图像的边缘:

详细步骤:
1.模糊原图
2.原图减去模糊图,得到Mask
3.Mask乘以一个正系数kk加到原图上,输出。

亮度、饱和度控制
用数值表示色的鲜艳或鲜明的程度称之为彩度。有彩色的各种色都具有彩度值,无彩色的色的彩度值为0,对于有彩色的色的彩度(纯度)的高低,区别方法是根据这种色中含灰色的程度来计算的。彩度由于色相的不同而不同,而且即使是相同的色相,因为明度的不同,彩度也会随之变化的。

详细步骤:
- 将RGB图像值归一化到[0, 1]
- 然后使用函数cvtColor进行色彩空间的转换
- 接下来可以根据处理灰度图像对比度增强伽马变换或者线性变换调整饱和度和亮度分量
- 最后转换到RGB色彩空间