ISP是Image Signal Processor的缩写,全称是影像处理器。在相机成像的整个环节中,它负责接收感光元件(Sensor)的原始信号数据,可以理解为整个相机拍照、录像的第一步处理流程,对图像质量起着非常重要的作用。
ISP(ISP PipeLine)的功能比较杂,基本上跟图像效果有关的它都有份。它内部包含多个图像算法处理模块,其中比较有代表性的是:扣暗电流(去掉底电流噪声),线性化(解决数据非线性问题),shading(解决镜头带来的亮度衰减与颜色变化),去坏点(去掉sensor中坏点数据),去噪(去除噪声),demosaic(raw数据转为RGB数据),3A(自动白平衡,自动对焦,自动曝光),gamma(亮度映射曲线,优化局部与整体对比度),旋转(角度变化),锐化(调整锐度),缩放(放大缩小),色彩空间转换(转换到不同色彩空间进处理),颜色增强(可选,调整颜色),肤色增强(可选,优化肤色表现)等。
景物通过 Lens 生成的光学图像投射到 sensor 表面上, 经过光电转换为模拟电信号, 消噪声后经过 A/D 转换后变为数字图像信号, 再送到数字信号处理芯片(DSP) 中加工处理。所以,从 sensor 端过来的图像是 Bayer 图像,经过黑电平补偿 (black level compensation)、镜头矫正 (lens shading correction)、坏像素矫正(bad pixel correction)、颜色插值 (demosaic)、Bayer 噪声去除、 白平衡(awb) 矫正,色彩矫正(color correction) 、 gamma 矫正、 色彩空间转换(RGB 转换为 YUV)、 在 YUV 色彩空间上彩噪去除与边缘加强、 色彩与对比度加强,中间还要进行自动曝光控制等, 然后输出 YUV(或者 RGB) 格式的数据, 再通过 I/O 接口传输到 CPU 中处理。
借用网上大神的图片介绍一下ISP处理流程,如下图:
关于raw(bayer)数据转换rgb数据:RGB图, 即为三色图, 一个像素点就由RGB三种颜色构成的混合色, 而bayer图一个像素就只有一个颜色, 或R或G或B. 因为bayer一个像素点只有一种颜色, 需要借助这个像素点周围的颜色对它进行插值(填充)另外的两种颜色, 它本身的颜色就不用插了.
关于色彩空间转换:在传输和存储上可以节省带宽和存储空间,例如一个RGB图像可以在捕捉之后转换为YCbCr格式用来减少存储和传输负担。在显示图象之前,再转回为RGB;在不同场合上可以根据需要做出转换,适应各种图像格式的需要,例如在做图像处理时算法可能需要YUV格式图像,而图像在屏幕显示需要RGB格式图像,有了色彩空间转换,就可以用一种格式的图像满足不同的图像格式要求。YUV 是一种基本色彩空间, 人眼对亮度改变的敏感性远比对色彩变化大很多, 因此, 对于人眼而言, 亮度分量Y 要比色度分量U、V 重要得多。 所以, 可以适当地抛弃部分U、V分量, 达到压缩数据的目的。
关于色温:所谓色温,简而言之,就是定量地以开尔文温度(K)来表示色彩。英国著名物理学家开尔文认为,假定某一黑体物质,能够将落在其上的所有热量吸收,而没有损失,同时又能够将热量生成的能量全部以“光”的形式释放出来的话,它便会因受到热力的高低而变成不同的颜色。例如,当黑体受到的热力相当于500—550℃时,就会变成暗红色,达到1050-1150℃时,就变成黄色,温度继续升高会呈现蓝色。光源的颜色成分与该黑体所受的热力温度是相对应的,任何光线的色温是相当于上述黑体散发出同样颜色时所受到的“温度”,这个温度就用来表示某种色光的特性以区别其它,这就是色温。打铁过程中,黑色的铁在炉温中逐渐变成红色,这便是黑体理论的最好例子。色温现象在日常生活中非常普遍,相信人们对它并不陌生。钨丝灯所发出的光由于色温较低表现为黄色调,不同的路灯也会发出不同颜色的光,天然气的火焰是蓝色的,原因是色温较高。正午阳光直射下的色温约为5600 K,阴天更接近室内色温3200K。日出或日落时的色温约为2000K,烛光的色温约1000K。
关于色温的规律:色温越高,光色越偏蓝;色温越低则偏红。某一种色光比其它色光的色温高时,说明该色光比其它色光偏蓝,反之则偏红;同样,当一种色光比其它色光偏蓝时说明该色光的色温偏高,反之偏低。由于人眼具有独特的适应性,使我们有的时候不能发现色温的变化。比如在钨丝灯下呆久了,并不会觉得钨丝灯下的白纸偏红,如果突然把日光灯改为钨丝灯照明,就会觉查到白纸的颜色偏红了,但这种感觉也只能够持续一会儿。摄像机的CCD并不能像人眼那样具有适应性,所以如果摄像机的色彩调整同景物照明的色温不一致就会发生偏色。白平衡就是为了避免偏色的出现。从而引出白平衡概念。
关于白平衡:白平衡就是针对不同色温条件下,通过调整摄像机内部的色彩电路使拍摄出来的影像抵消偏色,更接近人眼的视觉习惯。白平衡可以简单地理解为在任意色温条件下,摄像机镜头所拍摄的标准白色经过电路的调整,使之成像后仍然为白色。这是一种经常出现的情况,但不是全部,白平衡其实是通过摄像机内部的电路调整(改变蓝、绿、红三个CCD电平的平衡关系)使反射到镜头里的光线都呈现为消色。如果以偏红的色光来调整白平衡,那么该色光的影像就为消色,而其他色彩的景物就会偏蓝(补色关系)。白平衡是一个很抽象的概念,最通俗的理解就是让白色所成的像依然为白色,如果白是白,那其他景物的影像就会接近人眼的色彩视觉习惯。调整白平衡的过程叫做白平衡调整,白平衡调整在前期设备上一般有三种方式:预置白平衡、手动白平衡调整和自动跟踪白平衡调整。通常按照白平衡调整的程序,推动白平衡的调整开关,白平衡调整电路开始工作,自动完成调校工作,并记录调校结果。如果掌握了白平衡的工作原理,那么使用起来会更加有的放矢,得心应手。
备注:消色就是指黑白灰三种颜色。黑白灰的物体对光源的光谱成分不是有选择地吸收和反射而是等量吸收和等量反射各种光谱成分。这时物体看上去没有了色彩。对各种光谱成分全部吸收的表面,看上去是黑色,等量吸收一部分等量反射一部分的表面是灰色,反射绝大部分而吸收极小部分是白色。消色和任何色彩搭配在一起,都显得和谐协调。
关于白平衡原理:摄像机内部有三个CCD电子耦合元件,他们分别感受蓝色、绿色、红色的光线,在预置情况下这三个感光电路电子放大比例是相同的,为1:1:1的关系,白平衡的调整就是根据被调校的景物改变了这种比例关系。比如被调校景物的蓝、绿、红色光的比例关系是2:1:1(蓝光比例多,色温偏高),那么白平衡调整后的比例关系为1:2:2,调整后的电路放大比例中明显蓝的比例减少,增加了绿和红的比例,这样被调校景物通过白平衡调整电路到所拍摄的影像,蓝、绿、红的比例才会相同。也就是说如果被调校的白色偏一点蓝,那么白平衡调整就改变正常的比例关系减弱蓝电路的放大,同时增加绿和红的比例,使所成影像依然为白色。 自动白平衡,是依赖数码相机里的测色温系统,测出红光和蓝光的相对比例。再依据次数据调整曝光,产生红、绿、蓝电信号的增益。自动白平衡最大的优势是;简单、快洁。但有时按它的调整拍摄离准确的色彩还原还相距甚远。有时它还会帮倒忙。
关于黑电平:
(1)暗电流:物理器件不可能是理想的, 由于杂质、 受热等其他原因的影响, 即使没有光照射到象素,象素单元也会产生电荷, 这些电荷产生了暗电流。 而且, 暗电流与光照产生的电荷很难进行区分。
(2)Black Level:用来定义图像数据为 0 时对应的信号电平。由于暗电流的影响,传感器出来的实际原始数据并不是我们需要的黑平衡(数据不为0)。 所以,为减少暗电流对图像信号的影响,可以采用的有效的方法是从已获得的图像信号中减去参考暗电流信号。一般情况下,在传感器中, 实际像素要比有效像素多, 如下图所示, 像素区头几行作为不感光区(实际上,这部分区域也做了RGB的 color filter), 用于自动黑电平校正, 其平均值作为校正值, 然后在下面区域的像素都减去此矫正值, 那么就可以将黑电平矫正过来了。做了black level 矫正与没做black level 矫正的对比,没做black level矫正的图片会比较亮, 影响图像的对比度。
关于镜头矫正(Lens Shading):由于镜头本身的物理性质, 造成图像四周亮度相对中心亮度逐渐降低, 以及, 如下图所示, 由于图像光照在透过镜头照射到 pixel 上时, 边角处的焦点夹角大于中心焦点夹角, 造成边角失光。 表现在图像上的效果就是亮度从图像中心到四周逐渐衰减, 且离图像中心越远亮度越暗。 为了补偿四周的亮度, 需要进行 Lens Shading 的矫正。Lens Shading 的矫正的方法是根据一定的算法计算每个像素对应的亮度矫正值, 从而补偿周边衰减的亮度。 矫正方法有二次项矫正、 四次项矫正。
关于坏点矫正BPC(Bad Pixel Correction):
所谓坏点,是指像素阵列中与周围像素点的变化表现出明显不同的像素,因为图像传感器是成千上万的元件工作在一起,因此出现坏点的概率很大。一般来讲,坏点分为三类:第一类是死点,即一直表现为最暗值的点;第二类是亮点,即一直表现为最亮值的点:第三类是漂移点,就是变化规律与周围像素明显不同的像素点。由于图像传感器中CFA的应用,每个像素只能得到一种颜色信息,缺失的两种颜色信息需要从周围像素中得到。如果图像中存在坏点的话,那么坏点会随着颜色插补的过程往外扩散,直到影响整幅图像。因此必须在颜色插补之前进行坏点的消除。
(1)坏点:坏点为全黑环境下输出图像中的白点, 高亮环境下输出图像中的黑点。
(2)坏点修复方法:一般情况下, RGB 信号应与景物亮度呈线性响应关系, 但由于 Senor 部分 pixel 不良导致输出的信号不正常, 出现白点或黑点。坏点修复方法通常有两种:一种是自动检测坏点并自动修复, 另一种是建立坏点像素链表进行固定位置的坏像素点修复, 这种方式是 OTP 的方式。
关于Bayer去噪(Bayer Denoise):
使用 cmos sensor获取图像,光照程度和传感器问题是生成图像中产生大量噪声的主要因素。同时, 当信号经过ADC 时, 又会引入其他一些噪声。 这些噪声会使图像整体变得模糊,而且丢失很多细节, 所以需要对图像进行去噪处理,空间去噪传统的方法有均值滤波、 高斯滤波等。但是, 一般的高斯滤波在进行采样时主要考虑了像素间的空间距离关系, 并没有考虑像素值之间的相似程度, 因此这样得到的模糊结果通常是整张图片一团模糊。 所以, 一般采用非线性去噪算法, 例如双边滤波器, 在采样时不仅考虑像素在空间距离上的关系, 同时加入了像素间的相似程度考虑, 因而可以保持原始图像的大体分块, 进而保持边缘。
关于颜色矫正(Color Correction):
由于人类眼睛可见光的频谱响应度和半导体传感器频谱响应度之间存在差别,还有透镜等的影响, 得到的RGB 值颜色会存在偏差, 因此必须对颜色进行校正, 通常的做法是通过一个3x3 的颜色变化矩阵来进行颜色矫正。
关于宽动态(WDR):
动态范围(Dynamic Range)是指摄像机支持的最大输出信号和最小输出信号的比值,或者说图像最亮部分与最暗部分的灰度比值。普通摄像机的动态范围一般在1:1000(60db)左右,而宽动态(Wide Dynamic Range,WDR)摄像机的动态范围能达到1:1800-1:5600(65-75db)。宽动态技术主要用来解决摄像机在宽动态场景中采集的图像出现亮区域过曝而暗区域曝光不够的现象。简而言之,宽动态技术可以使场景中特别亮的区域和特别暗的区域在最终成像中同时看清楚。
ISP调试问题及解决
问题:在室内开灯场景下,屏幕闪烁。
解决:确认屏幕亮度是否为100,若不是则配为100;仍然闪烁则打开抗闪功能,配置抗闪频率为交流电频率
问题:在没有开灯场景下,屏幕依旧闪烁。
解决:确认屏幕亮度是否为100,若不是则配为100;适当调节AE模块的u8Speed和u8Tolerance参数
问题:图像从暗到亮的时间过长
解决:调节AE模块的u8Speed和u16BlackSpeedBias参数
问题:人脸图像过暗
解决:配置AE模块的enAEStrategyMode参数为AE_EXP_LOWLIGHT_PRIOR模式,同时增大u16HistRatioSlop的值;适当调节gamma参数;也调用海思提供的API HI_MPI_ISP_GetStatisticsConfig(ViPipe,&pstStatCfg); 和 HI_MPI_ISP_SetStatisticsConfig(ViPipe,&pstStatCfg) 设置图像权重;wdr模式下还可调节曝光比和曝光时间范围。
问题:图像过曝
解决:(1)在光线条件良好情况下,确认是否开启抗闪功能,尤其是室外,若开启则关闭抗闪;(2)确认曝光时间范围是否合理,调节曝光时间范围参数,减小最小曝光时间;(3)wdr模式下则减小最小曝光比参数;(4)确认图像权重配置表是否合理,不能全为0。
解决:主要是sharpen的边缘锐化强度过大,可以调节EdgeFiltStr 、EdgeFreq、EdgeStr这几个参数,优先调节增大前面两个参数,还不行再调最后那个参数。
这个主要调节3DNR参数,尤其是运动相关的参数,消除拖影后稍微调节sharpen、NR,适当提高清晰度,降低噪声。
问题:图像噪点过多
解决:首先确认曝光时间范围的最大值是否过小(30帧下最大曝光时间为33306),如果太小则增大曝光时间最大值;确认模拟、数字、ISP三个增益大小,适当降低增益,调节顺序为ISP–数字—模拟(模拟增益带来的噪声最小),同时适当减小AE的u8Compensation亮度补偿参数,开启海思ISP后端去噪算法模块,增强去噪强度;若还无法去除增益,可调用HI_MPI_ISP_GetPubAttr(ViPipe, &pstPubAttr); 和 HI_MPI_ISP_SetPubAttr( ViPipe, &pstPubAttr); 这两个API适当降低帧率(人脸识别最低帧率为6fps)。
问题:图像亮度不够
解决:确认曝光时间范围的最小值是否过小(30帧下最大曝光时间为33306),如果太小则增大曝光时间最小值;提高AE的u8Compensation亮度补偿参数;调节gamma等亮度相关参数;适当增加增益,调节顺序为模拟—数字-- ISP(模拟增益带来的噪声最小)。
问题:图像不清晰
解决:首先确认镜头焦距是否调到最优,确认焦距是否打在想要的物体的位置上;调节gamma、sharpen等相关IPM参数。
为获取需要显示的较清楚的图像,海思首先调节sensor的曝光时间,如果在没有超过最大曝光时间情况下就能够使图像达到设定的目标亮度,就不会再调节增益,这样可以最大程度减少因为增益带来的噪声;如果曝光时间超过曝光时间范围仍然无法达到设定的目标亮度,就会调节模拟增益,如此类推下去。所以海思调节顺序为曝光时间—模拟增益—数字增益—ISP数字增益(不调节光圈的情况)。曝光时间范围与帧率相关,例如在帧率为30fps下,每帧图像的显示时间最大为33.333ms,除去最小的显示时间以及一些必要等待时间,一帧图像最大曝光时间约为33.3ms,如果曝光时间超过这个最大值,sensor将不再调节曝光转而调节增益,增益带来最大问题是噪声(通常是亮度噪声、随机噪声),所以后端需要去噪。另外适当减小u8Compensation、u16HistRatioSlope 这两个参数,降低目标亮度值,让增益降下去也能达到降噪效果。
关于海思平台的自动降帧:使能AE模块中的enAEMode参数,调节u32GainThreshold系统增益门限值和u8Compensation,这两个值的大小对降帧程度有影响,在极低照度下为了得到较好图像质量,同时画面不卡顿,需要平衡好u32GainThreshold以及sensor的模拟增益范围stAGainRange中的最小增益值的大小。在暗光环境下,一般u32GainThreshold大于12000,模拟增益最小值设为50000以上或者最大。同时适当减小u8Compensation、u16HistRatioSlope 这两个参数,降低目标亮度值,最大程度避免增益带来噪声,也可避免降帧后帧率过小。
关于暗光环境调试:在黑暗环境下,为了得到质量较高的图像,需要从曝光时间、增益、曝光补偿等参数调节。在尽量不引入噪声的情况下,优先调节帧率,通过降低帧率使每帧图像曝光时间加长,极限最低不得低于6帧(一般为12帧),否则画面会卡顿;然后调节模拟增益,模拟增益有分高、低模式,有些sensor默认配为低增益模式(约最高增益的1/3,如技术支持给的驱动),这样模拟增益无法达到最高导致需要调节数字增益,会引入更多噪声,所以确定驱动是否使用高增益模式,同时cmos.c中的增益表可配最大值配为与sensor最高增益一致。另外亮度补偿等与亮度相关参数调低,避免ISP调节数字增益和ISP增益。如果AE Route路径的曝光时间和增益无法自动配置为sensor可配的最大值,还需要配置好AE Route参数。
宽动态模式下图像偏色问题:技术支持说法是这个不可避免,这是为了减少鬼影和色域引起的噪声等副作用。通过提高饱和度,降低rgb通道去噪强度可以一定程度提升图像颜色质量。怀疑是CCM标定工作未做好的问题。
宽动态模式下室内图像会闪烁:室内宽动态存在闪烁或者夜景模式下要求打开fusion模式,同时适当调节宽动态模式下的降噪强度。
问题:如何确认当前环境是否逆光?
解决:在目前我们产品中,确认环境是否逆光前提是在白天或光线较好的场景下判定,而对白天或光线条件的判定,我们使用光敏获取环境光线情况来判定;在光线良好情况下,判定为逆光环境的条件为:经过测试发现,在光线较好场景下,逆光与非逆光最大区别是ISP对ISO参数的调整。光线较好非逆光时,在低光优先模式下,sensor一般通过调节曝光时间即可满足目标亮度要求,如果调节曝光还不满足也只会微调ISO,一般调整ISO不超过250;光线较好逆光时,在低光优先模式下,人脸因为逆光而变黑,sensor仅调节曝光时间一般无法满足目标亮度要求,且会较大幅度调节ISO(模拟增益、数字增益)值,当ISO超过一定值则可认为逆光(目前我设置的逆光时ISO阈值为280,经过测试,该阈值可设为250-350,根据场景进行微调)。
注意:这只能适应一般光线较好的环境,且精准性不会非常高,而精准性需要依靠光敏对环境判定的精准性、对各个参数的获取的实时性、以及对各个参数的综合和代码逻辑实现的准确性。而在黑夜逆光环境下的精准性很可能会大幅下降,导致wdr和线性两种模式来回切换。另外,为了尽可能避免人脸距离镜头太近使镜头进光量减少导致ISP继续调大曝光甚至ISO过大引起误切换,亮度补偿值compensation稍微往下调(56-64即可)。
解决:调整gamma和DRC参数或者关闭这两个参数看看是不是有问题,检查硬件连接与掩码配置是否匹配。
问题:人脸在整个画面中偏暗
解决:AE设置为低光优先模式,提升HistRatioSlope值,减小MaxHistOffset值,打开DRC,更换系数较低的gamma参数表,调整曝光权重表(增加中间区域的值,减低四周的值)。
问题:光线均匀时没有问题,明暗交替场景,暗部出现偏绿或者亮部出现偏粉
解决:调整GAMMA暗部或者亮部的曲线,让暗部或者亮部的值拉低,调整tonemapping。