学习参考:isp流程介绍(yuv格式阶段) - 知乎
一、RAW
1.1 ISP RAW 之DPC
DPC(defective pixel correction)也就是坏点矫正,在sensor接收光信号,并做光电转换之后。
这一步设计的意义在于:摄像头sensor的感光元件通常很多会存在一些工艺缺陷缺陷,让图像上某些像素无法正常收集到需要的光信号,导致图像出现明显高光或者死黑像素点。
通常的作法,可以是sensor厂商检测标定出这些坏点,然后直接矫正。也可以是拍摄图像之后,通过特定算法进行直接软件矫正。
DPC通常通过以下步骤实现:
-
坏点检测:首先,系统需要对图像传感器进行扫描,并检测出存在的坏点。这可以通过比较传感器输出与预期值之间的差异来实现。任何与预期值偏差过大的像素都可能被视为坏点。
-
坏点标记:检测到的坏点通常会被标记在一个坏点地图中。这个地图会记录哪些像素被识别为坏点,并且可以被后续的处理步骤使用。
-
坏点修复:一旦坏点被检测和标记,就需要采取措施来修复它们。修复的方法通常是通过对周围像素的信息进行插值或替代来填补坏点的值。这样可以使坏点周围的区域看起来更连续和自然。
-
后处理:修复坏点后,可能需要进行一些后处理步骤,如去噪、锐化等,以进一步改善图像质量。
1.2 ISP RAW 之BLC
BLC(Black Level Correction)也就是暗电流矫正,本质上来说,isp需要做这一步的原因也是因为硬件缺陷。
主要是因为感光元器件和光电转换之类器件在输入光强度为0,也就是环境光线全黑的情况下,依然会有电压输出,引起结果图像实际像素值大于0,导致图像出现异常。
最简单的做法:在实验室全黑环境下,拍摄一张全黑的raw图像,分别计算图像rggb通道平均值并保存,实际拍图时候,每张图像的rggb通道都减去对应的平均值,并归一化得到矫正之后图像。
1.3 ISP RAW 之LSC
LSC(Lens Shading Correction)也就是镜头阴影矫正,常规意义上来说,这一步也可理解为硬件缺陷导致的,本质上是由于镜头光学特性引起的。
整体上这种缺陷又可以分为两类:
1、Luma shading:镜头从中心到边缘逐渐出现了能量衰减,导致结果图像呈现中心亮四周黑的现象。
2、不同颜色的光折射率不同,白光经过镜头到成像sensor时候,由于折射率问题,会导致不同颜色光落到不同位置上,引起偏色。
最简单暴力的矫正方法:将输入图像平均分成24x24之类的块,默认中心块的亮度和颜色为gt,将其他块的亮度和颜色直接往中心块靠齐。矫正前和矫正后图像可以参考如下图片。
需要特别注意的是,本身来说,核心缺陷在于中心进光量远大于边角,这一步虽然可以亮度/颜色强行修正,但是必然出现噪声放大和缓解不了解析力不足的缺陷,
边角去噪可以在继续牺牲解析力情况下,缓解放大后的边角噪声,但是边角解析力在不引入额外设备或者说叠多帧的条件下,那是基本没救了的。
1.4 ISP-NR Raw
NR Raw(noise reduction for Raw)也就是Raw域去噪,单纯的图像去噪算法在这几十年发展中,已经有了无数种,简单按类别来分,就有简单空域滤波(比如高斯),考虑像素值相识性(如双边),变换域去噪(如小波),考虑图像块内容结构相似性(如nlm,bm3d),加入时域信息(mfnr),基于聚类训练(如各类字典或者RAISR等),基于nn网络等。
去噪算法这块,有兴趣的后面慢慢折腾讲,这里展开讲的话,相对于isp来说,就有点太发散了。我们这里重点只讲下isp raw当前这个节点去噪的明显优势。
去噪之前,首先我们需要知道噪声产生原因:噪声一般是 sensor 接收光子,然后转化成 RAW 图的过程中产生的,通常由这几个阶段参数:
1、sensor接收到光粒子,光粒子激发电子时候,会产生 photon noise,该噪声服从泊松分布。
2、sensor本身发热产生暗电流,引入dark noise 或者热噪声,该噪声服从泊松分布。
3、电子产生电流再被模拟放大器放大信号时候,产生read noise噪声,属于加性噪声。
4、模拟信号进行ADC模数转换,得到离散照度值时候,会产生adc 噪声,也属于加性噪声。
总结下来,Raw图像上一共应该会有两类噪声:泊松和加性噪声。 设备在实验室特定环境下,拍摄特定场景并通过计算,可以直接估算出这两类的噪声参数
将这些噪声参数,引入去噪算法中,比如nlm之类权重计算时候,加入这些参数引导去噪,可以进一步改善算法去噪效果。更明显优势是:当我们有了sensor的噪声参数之后,就可以根据这些参数数据,生成符合该sensor噪声形态的无数噪声图像数据,这些噪声叠加到干净gt图像上之后,就有了无数训练数据对,nn去类算法最头痛的训练数据问题在这里得到解决,并且nn训练时候只需要学会对这类噪声形态去噪,泛化性要求明显降低,对去噪效果提升和模型小型化非常友好,
但是如果Raw图像经过了后续的Demosiac/gamma/ltm之类操作之后,那么噪声形态会被严重破坏,导致无法估算sensor的噪声参数。所以后续阶段上做去噪,不止无法使用噪声参数这个先验信息,还将面对更复杂的噪声形态
1.4 RAW ISP AWB
AWB(Auto White Balance)也就是自动白平衡,该模块存在的原因在于,人眼本身拥有视觉矫正功能,它可以在不同光源情况下,还原识别出物体本身的颜色。
但是sensor没有这个能力,光源变化产生的颜色变化,会对sensor带来一样的变化影响,不同色温环境下,拍出来的图像颜色会随着色温变化而变化(如暖色温情况下,排出的结果图会偏红)。
自动白平衡就是给sensor加上人眼的视觉矫正功能,简单实现来说,就是计算出当前场景的偏色情况,然后方向补偿,将偏色强行拉回到正常颜色上。最暴力的做法,在需要矫正的环境光线下拍一张灰卡,灰卡在实际场景上拍摄出来的偏色层度,就是WB需要反向补偿矫正的强度。
1.5 RAW ISP demosaic
Demosaic也就是去马赛克,该模块存在价值,主要是为了节约sensor成本,理论上来说,将拍摄现实场景画面,使用三个sensor同时收集r,g,b通道信息,并保证r,g,b通道像素点对齐的话(其实不保证也应该没关系,配准算法后端对齐后也能用),就不需要Demosaic,直接可以得到rgb彩色图像了。
RAW ISP demosaic(RAW图像处理中的插值处理)是图像处理中的一项重要步骤,它用于将原始RAW图像数据转换成彩色图像。当摄像头捕捉到图像时,传感器通常只能记录单色(例如红色、绿色和蓝色)的图像信息,而不是完整的彩色图像。为了生成彩色图像,需要对这些单色数据进行插值处理,将它们组合成完整的彩色图像。
这个过程通常包括以下步骤:
1. **Bayer图像排列**:传感器记录的原始数据通常采用 Bayer 排列,其中单个像素只记录一种颜色(红、绿或蓝),并按照一定的模式排列。常见的 Bayer 排列模式包括 RGGB、BGGR、GRBG 和 GBRG。
2. **插值处理**:插值处理是将单色像素插值为彩色像素的过程。最常见的插值算法之一是双线性插值,它通过对周围像素的加权平均来估算中间像素的值。还有一些更复杂的插值算法,如基于梯度的插值算法、自适应插值算法等,它们可以在不同条件下提供更好的性能和质量。
3. **去马赛克处理**:在插值完成后,可能需要进行去马赛克处理,以减少图像中可能出现的色斑和伪影。去马赛克处理通常是通过一系列滤波和平滑操作来实现的。
4. **色彩校正**:最后,可能需要进行色彩校正以调整图像的颜色和对比度,以确保最终输出的图像质量和色彩准确性。
总的来说,RAW ISP demosaic 是将原始的单色图像数据转换成彩色图像的关键步骤之一,它对于获得高质量的彩色图像具有重要意义。
二、RGB
2.1 rgb isp之gamma
ISP流程里加入gamma
1、在液晶屏作为新一代显示器之前,早期的显示器设备主要是一种叫CRT的显示设备,这类显示器输入电压和屏幕亮度并不是线性关系,而是大概满足:gamma_2.2的映射关系,所以图像输入数据,需要反向进行gamma_1/2.2的调整,来保证图像显示正常。
2、人眼对环境亮度的响应并不是线性关系,而是对暗处环境变化更加敏感,所以通常我们希望对暗区提亮和拓宽暗区的动态范围。
但是目前实际上来说,并不会完全参考所谓gamma_1/2.2之类操作,而是通常ISP调试时候,会根据不同硬件,不同应用场景和不同客户喜好,针对性的做不同强度的gamma调整。
并且随着动态范围和对比度调整算法的相关发展,除了全局gamma之外,各类局域gamma或者叫ltm调整之类算法,也被广泛应用在ISP内部芯片中
2.2 rgb isp 之CCM
CCM(Color Correction Matrix)也就是颜色矫正矩阵,该模块引入的原因在于:
1、sensor本身并不能保证很好的色彩还原,不同的镜头/感光芯片对色彩的还原程度都有不同强度的偏差。
2、ISP前端处理,比如Gamma之类操作,会导致图像的色彩还原效果偏差变得更加严重。
因此,我们需要一步类似标定的颜色矫正工作,将不同硬件差异的sensor和不同gamma强度调整等操作后的图像,还原到真实色彩空间样子。
简单来说,就是我们希望得到一个3x3的M矩阵,可以让右边输入图像的R/G/B颜色,经过该矩阵变换后还原为左边颜色水平。反应到实际操作:
1、获取到当前sensor拍摄,待CCM矫正的RGB 24色卡图像,作为input图像。
2、使用现有拍摄好,色彩还原良好的24色卡图像作为ref(这个标准图像可以直接在网上找到),取出24色卡上各自对应色块信息填充到公式中(所以公式中的n=24, 有些计算里面色块最下面那排没有参加计算,这种情况下n=18)。
3、使用最小二乘法,求解出该sensor的颜色矫正矩阵M。
这里需要特别注意的是,通常来说ISP走到这一步的时候,基本是已经经过了AWB白平衡调整了,所以必须要保证这里做颜色矫正,不会破坏调整好的白平衡效果,那么就需要求解出的M矩阵还要满足一个特定条件:
a11+a12+a13=1.0
a21+a22+a23=1.0
a31+a32+a33=1.0
让原本R=G=B的输入图像,在经过M矩阵矫正之后,还能满足Rnew=Gnew=Bnew。所以在前面第三步,求解M的时候,需要使用带约束条件的最小二乘法求解。
2.3 rgb isp csc
CSC(Color Space Convert)也就是颜色空间转换,在ISP里面的物理意义,通常都是都是将RGB图像转换到YUV空间中。这一步的基本左右,在我理解里面主要是两方面考虑:
1、将rbg分离为Y(亮度)和UV(颜色)信息,由于人眼对亮度信息的敏感程度远大于颜色,因此在一些亮度调整,纹理信息处理(Y去噪/锐化)等操作,可以在Y通道针对性处理;而一些对亮度纹理信息不相关的颜色操作,就可以在uv通道上进行调整。
2、ISP里面通常转换后的UV通道图像尺寸,宽高都只有Y一半左右,也就是RGB转YUV数据之后,全图像的像素值数量减少一半,ISP需要处理的数据量大幅度降低。
常见的RGB转YUV方法,都是一些标准公式操作,我这边就不详细讲解了,小伙伴们可以参考:
图像信号处理芯片设计原理----11 RGB转YUV及YUV格式 - 知乎
YUV有多少种标准?为什么YUV和RGB转换有那么多种公式? - 知乎
等文章,需要特别小心的就是,RGB和YUV的数据转换公式有很多套,当使用了某一个RGB转YUV格式之后,必须使用它配套的YUV转RGB公式,才能对应恢复出原图
三、yuv
上文已经分别讲了raw域和rgb域的相关算法流程 从前面文章里面可以看到,在Raw和Rgb域里面,很多ISP算法操作,更像是属于sensor矫正或者说sensor标定操作。本质上来说,设计的目的上很多是为了改善sensor本身的硬件缺陷。
而在Yuv域中,更多一些的是对图像画质的增强或者说风格化处理,在设计意义上,与前面Raw和Rgb阶段稍微存在一点区别。如前文描述,Rgb图像经过CSC格式转换得到YUV图像,将人眼敏感的亮度信息和不太敏感的颜色信息分离。因此,在Yuv阶段整个流程中,可以看作是能够并行的对亮度通道Y处理,和对颜色通道UV处理。
2.1 Y通道处理
2.1.1 Luma NR
Luma NR也就是对亮度通道去噪,其实前面Raw格式阶段,已经有去噪模块,并且有提到,在Raw图像上去噪,去噪难度上能明显好于在后端去噪。但是这块存在历史问题,以前的ISP设计或者说低端硬件设备上,通常无法集成太强大的复杂去噪算法,这就导致Raw图像去噪时候,为了保留更多细节,通常并不会做太多或者太强的去噪,导致后面这边YUV处理时候,需要做进一步的去噪处理。
就目前来说,比较好的ISP上,比如最近比较火的AI ISP,通常都集成的相对强大的Raw去噪算法,可以做到在保住尽可能多细节情况,把图像噪声基本处理到期望水平。这种情况下Yuv这里,就可以直接把去噪模块省掉了。
常见的luma NR算法有很多,这里就不详解列举了,后面要研究去噪算法时候再慢慢折腾。
如下图所示:左边为待去噪图像,右边为Luma去噪后图像,可以看到去噪后图像上亮噪基本没了,但是由于没有UV去噪,导致残留有大量的色斑
2.2.2 Edge Enhance
Edge Enhance某种程度上可以理解成抗噪声的图像锐化,期望是在不明显放大噪声情况下,对图像做一些锐度调整,让图像清晰度看起来更加符合人眼感觉。需要注意的是:该模块通常可以明显提升图像清晰度,让图像纹理更清晰,但是并不能无中生有,生成出图像上原本没有的纹理细节。
常见的作法有选择性锐化或者说多尺度锐化,简单理解就是将输入图像分解到不同频段,在不同频段做纹理细节或者说边缘检测,然后做不同强度的锐化增强,进而得到期望的清晰度增强结果图像。
但是边缘增强,并不是越强越好,如下图可以看到,右边锐化后结果图像,红框位置出现了明显黑白边异常,因此调整边缘增强时候,需要主要各个频段增强系数,避免图像异常。
根据个人经验来说,这类算法在实现上,最大的难点在于如何抗噪声干扰,也就是如何保证确实只对连续的边缘进行了增强,这就需要比较准确的,从噪声中分离出边缘细节。但是换句话说,既然都能把噪声和边缘细节分离出来,那基本上也就做了和去噪类似的事情。换个角度来说,如果去噪算法足够好,那么细节增强时候,不用考虑噪声干扰的话,该算法在设计和实现上,将会变得非常简单。
2.1.3 Contrast&Brightness
亮度的定义上:Y图像上像素值越接近255表示图像越亮,越接近0表示图像越暗;
对比度的定义上:假定图像亮度范围为[a, b],那么b-a越接近255则表示图像对比度越强,反之越接近于0,则表示图像对比度越差。
数字图像处理上,定义了最常见的亮度/对比度调整公式:g(x)=αf(x)+β, 其中α和β分别表示图像的对比度和亮度调整强度。
常用的对比度调整算法还有直方图均衡化,CLAHE等,主要用来控制结果图像的用户风格喜好。
简单效果对比,可以参考如下截图(左图为亮度/对比度调整前,右图为调整后)。
2.2 UV通道处理
2.2.1 chroma NR
Chroma NR也就是彩色噪声去除,它的实现和Luma NR有比较大的区别,最明显的差异在于人眼对颜色的敏感程度远小于亮度变化,因此设计UV通道去噪时候,可以不用考虑微弱纹理,只需要保住强边就好,简单暴力来说,可以直接使用多尺度的强保边滤波器进行去噪处理, 另外在不考虑微弱纹理情况下,多帧堆叠对去uv色噪非常友好。当然了,如果是因为awb异常导致的整体色斑偏色或者暗电流整片底噪的话,那当我没说过。。。
需要特别小心2个地方:1、边缘颜色扩散。2、滤波去噪后uv出现颜色偏差。一般来说,会考虑将y通道信息加入滤波,使用y通道信息作为引导,来改善滤波可能引起的颜色扩散和偏色等问题
具体算法实现的话,等后面有兴趣整理这块时候,在单独慢慢折腾了。对细节感兴趣的话,小伙伴们可以先参考这个:刘斯宁:Understanding ISP Pipeline - Noise Reduction
去噪前和去噪后效果对比大致如下,可以看到输入图像上色斑基本处理干净。
2.2.2 Hue & Saturation
Hue & Saturation主要是在做颜色和饱和度调整,简单来说就是根据需求,针对性的对图像不同区域的UV通道信息进行调整。YUV格式之类科普我这里就不做了,需要了解的话,可以参考:YUV格式到底是什么?-腾讯云开发者社区-腾讯云 等资料。
具体来说,这里设计的功能,最初主要用来对不同应用场景和不同客户喜好的风格调整,比如希望颜色更鲜艳一些之类需求。随着发展逐渐加入了肤色调整(让肤色还原度更高),天空调整(比如让天空更蓝)等操作,近些年很多还加入了场景适配,简单理解就是对预览输入画面进行场景识别,比如风景/人像/宠物/美食等,对不同场景适配不同参数,让对应的场景颜色等维度,分别能都更加符合人眼感官。
具体颜色转换相关细节,这里也不深入讲了,后面研究这块时候慢慢刷再。目前的话,小伙伴们,可以参考:刘斯宁:Understanding Hue and Saturation 等资料