打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
好色之图 | CMOS成像如何接近人眼感受效果?图像亮度暗藏ISP算法玄机

前言:

这篇文章是我从事ISP研究数年来的一些经验总结,没有用到深奥的理论知识,有的只是根据实际状况来处理的一些常规方法,以及曾经犯过的错误总结。我想把ISP function的原理用简单浅显的语言描述出来,希望对初学者有所帮助。这里的ISP主要是指从CMOS  sensor输出的bayer pattern,到转换成通用的YUV或者YCbCr格式的过程,通常用于USB摄像头/监控摄像头/手机/平板等芯片设计中。

 

2.图像亮度

ISP算法的目的是要让CMOS成像接近人眼的感受效果,所以首先要比较人眼成像和CMOS成像的差异。从图像亮度这方面来看,最重要的就是曝光,其次有针对显示器特性的Gamma映射,针对CMOS sensor 特性的Black Level Correction,针对镜头透光性的Lens shading Correction,以及anti-flick等,下面逐一介绍。


2.1曝光

影响CMOS Sensor 成像亮度的因素有光圈大小,曝光时间以及Sensor像素本身的感光特性。光圈越大,进光量越大,图像亮度和光圈大小成正比。曝光时间越长,接收到的光子数量越多,图像亮度和曝光时间也成正比。Sensor本身像素敏感度则和pixel size大小,以及CMOS process(FSI/BSI)相关。在Sensor内部,完成光电转化之后的电位,还需要通过一个模拟/数字增益电路,增益越大,图像越亮,同时Noise也会被放大,在sensor的参数设定中有这个analog/digital gain,即通常说的ISO。


对于人眼来说,瞳孔是人眼的口径;虹膜是光圈,像是孔径内的档板。在角膜的折射造成有效孔径 (入射瞳)。入射瞳的直径通常是4mm,但是它的范围可以从在明亮地方的2mm变化至黑暗地方的8mm。
Sensor和人眼的对比如下表格:

 

从以上表格内容可以看出,人眼是靠调整光圈来适应环境亮度,而一般的摄像头则是调整曝光时间和增益来适应环境亮度。相比而言,人眼在同一场景下所能感受的亮度动态范围要比CMOS sensor大很多倍,在很多户外场景中,摄像头拍出的照片局部过曝,或者局部太黑,因此摄像头很需要HDR技术:同一场景下拍摄不同曝光时间的多张图片(扩大动态范围),来合成一张图像。另一方面CMOS sensor的曝光时间理论上可以无限长,因此摄像头可以拍下和人眼平常所见不同的美景,例如夜晚的星空和城市夜景(通常曝光时间要好几十秒)。不过对于视频拍摄来说,较长的曝光时间意味着运动物体会变模糊,所以一般都要求帧速率在15fps以上,即曝光时间最大只有1/15s。在这个约束条件下,一般的Sensor感光效果相比人眼差很多,在暗光下为了使图像可见,必须要用很大的模拟或者数字增益,很多sensor会到64倍增益,这带来了很大的Noise,人眼是没有Noise这一说法的哦。


在ISP中,自动曝光AE有相对成熟的算法。首先以人的视觉主观感觉确定一个目标亮度,这个亮度要让用户看着合适,具体数值看用户喜好和真实环境可以调整。然后统计当前图像的实际亮度。统计的方法常见的有两种。


一种是基于亮度均值的方法,例如把整幅图像分割成若干个矩形框,分别统计矩形框中像素平均亮度,不同位置的矩形框有不同的权重系数,然后加权平均得到整幅图像的亮度均值。下图为两种常见的权重设置方式:中间优先(适用于人像拍摄)和下方优先(适用于行车记录仪)。

 

(左)中心优先     (右)下方优先

Figure 2.1.1 亮度统计权重


在人像拍摄的时候,有时并不知道人脸的位置在哪里,如果此时背景比较明亮,那么人脸可能会拍得比较暗。假如上层应用中有人脸检测功能,那么就可以告诉ISP人脸的位置在哪里,ISP对人脸所在的位置进行亮度统计,把得到人脸的亮度和整幅图像的均值做加权平均,重新得到当前亮度。


对于平板和手机而言,还有touch AE,拍摄视频/照片的时候,在屏幕上点击感兴趣的位置,那么AE 和AF 都会跟着有变化。在ISP中,就是对着touch的区域做亮度统计,把touch区域的亮度和整幅图像的均值再做加权平均,重新得到当前亮度。
 

还有一种方法是基于直方图统计的,力争让图像的灰阶分布比较好,特别是在高反差的情况下,像素主要分布在直方图的两端,亮度均值的算法不太适用。直方图数据可以明显的反映出这种状况,从而选择暗光优先模式或者亮光优先模式。
 

以上介绍了当前图像的几种亮度统计方法,得出当前亮度,接着要计算当前亮度和目标亮度的比例关系,根据这个比例关系来调整Sensor的曝光时间和增益。 我们已经知道图像亮度是和曝光时间及增益成线性比例关系,有如下公式:

目标亮度/当前亮度 = (期望曝光时间×期望增益)/(当前曝光时间×当前增益)


AE算法要在期望曝光时间和期望增益之间做一定的平衡,增益较大的话会有Noise,曝光时间长的话会导致帧速率fps下降。此外,AE控制算法还需要注意两点:一是给sensor下的曝光参数并不是实时生效的,往往会有几个Frame的延迟,要小心避免AE来回震荡;二是要切换AE参数要平稳一些,渐进的方式达到目标亮度,一步到位的视觉感受并不好,AE收敛速度和AE稳定性需要平衡。
 

2.2 Black Level Correction

黑电位校正是由于CMOS sensor 本身由于暗电流的存在,导致在没有光线照射的时候,像素单位也有一定的输出电压。需要把这个电位减去,让输出的数据呈现出随亮度线性变化的规律。一般的Sensor都有BLC参数,sensor厂商会给出已经调校好的参数,在ISP中也还有进一步的BLC存在。但ISP的BLC 一般只是微调数据,有些sensor在不同色温或者环境亮度条件下需要调整。如下图:

     (左)Normal             (中)Disable sensor BLC         (右)BLC 参数异常
Figure2.2.1


右侧的图像在一定环境下,呈现偏红色,因此需要对R分量减去一个较小的幅度。同时为了对整幅图像数据不造成大的影响,R分量还要保持0~255的取值范围,所以BLC 计算公式如下:

f(x, Δ)=(x-Δ)*255/(255-Δ)


其中Δ为BLC校正的数值, x可以是R/G/B中的任意一个分量,取值范围在0~255. BLC的映射关系图如下,水平方向表示物体亮度,垂直方向表示Sensor像素的输出值,蓝色为BLC之前的数据,红色为BLC之后的数据。

 

Figure 2.2.2 BLC 映射关系图


BLC参数Δ不宜设置过大,Δ越大,则感光动态范围越小。一般要求在图像效果可接受的范围内,Δ越小越好。判断Δ设置是否到位的一个简单方法是把sensor完全遮黑,看看输出数据是否逼近0值。


2.3 Lens Shading Correction

由于Lens的不同区域透光性能不一致,导致图像中心区域较亮,图像四周较暗。如下图:

 

Figure 2.3.1 Lens shading


一般来说,物体到lens中心的距离越远,图像越暗,呈圆形中性对称的方式递减。在算法中很容易想到用曲线映射的方式来补偿亮度。假设像素到lens 中心的距离为d, 那么根据d映射一个lens shading gain,映射曲线类似抛物线的形状,每个像素根据自己的d,乘以相应的gain。

 

Figure 2.3.2 Lens shading Gain

 

这个Gain在lens中心点(d=0)为1,d越大gain也越大,有些lens在最远的角落可能达到3倍。正是有些Lens shading gain很大,导致了整幅图像中四周的Noise明显比中心大很多。这条曲线的形状受lens和sensor特性不同而差异很大,对不同波长的光线衰减程度也不一样,R/G/B三个分量分别需要各自的映射曲线,我们一般采用分段线性插值的方式来模拟这三条曲线,如figure2.3.2(右)。

 

要进行LSC运算,需要知道三个信息:一是lens 中心坐标(Cx,Cy),二是三条曲线形状,三是像素到(Cx,Cy)的距离d。首先我们回顾一下ISP 构架图figure 0.1,可以看到LSC的位置很靠前,仅在BLC之后,在bayer pattern domain。我们先要拍摄一张bayer pattern的图片,要保证整幅画面的亮度是一致的:一种方法是拍摄内容为纯白色或者灰色,这需要绝对的光照均匀;另一种方法是用亚克力板遮住sensor拍白色光源。然后对这张图片进行用一定的方法计算,找到最亮的位置就是lens中心坐标(Cx,Cy), 然后找出到lens中心距离相同距离d(i)的点的集合,计算这个集合内像素平均亮度和中心像素亮度的比例关系r(i),取r(i)的倒数就是LSC gain曲线上d=d(i)的gain值。在ISP中(Cx,Cy)和LSC gain curve是预先由tool计算好,作为参数写入到register中的。对于从左往右自上而下逐行传输的图像,任意一个pixel到lens 中心的距离d是需要计算的,如果用距离计算公式则用到平方根,计算速度较慢。不过任意两个相邻像素到lens中心的距离是有相互关联的,知道了左边像素的距离,可以通过简单的几步加法运算递推出右边像素的距离,有兴趣的同学可以尝试推导一下。

 

 

在实际使用中,由于周边Noise实在较大,我们不得不在四周亮度和Noise之间取一个平衡。在低光照条件下,通常会让四周的亮度达到中心亮度的70%~90%就可以了。环境色温的差异,也会导致计算出LSC gain curve有所差异,在调校IQ的过程中,会计算多种色温的LSC gain curve,然后在实际使用过程中动态的调整curve形状。


除了上述圆形的LSC以外,还有一种网格状(grid)的LSC方式。这种方式早期是用于纠正CMOS sensor由于制程漂移导致的局部色偏问题。Sesnor不同区域的像素滤光片性能不一致,导致图像局部偏色,这种偏色没有规律性,于是只好用grid的方式来补偿。每个网格内需要有一组rgb gain,Grid数量越多,所消耗的资源也越大。对任意一个像素,找出其四周的4组rgb gain,用双线性插值可以计算出自身的gain。当grid足够密集的话,就可以取代圆形的补偿方法,代价是成本较高。

 

Figure 2.3.3 Grid LSC


2.4 Gamma
Gamma这一特性源自于传统的CRT显示器,电子射线打出的屏幕亮度和电压是一种gamma曲线的关系,基本映射波形曲线如下:

Figure2.4.1 CRT 映射曲线


后来为了兼容性,液晶/LED等显示器都需要做这样映射,在ISP中,就需要做反映射,理论上的数学公式如下,L为归一化的输入亮度信号:

 

相应的曲线形状为:

Figure2.4.2 Gamma映射曲线


通常情况下,这条曲线的形状并不是固定的。我们会根据实际情况来调整曲线幅度,一般我们会说gamma=2.2。这个2.2数值就是上述公式中指数的倒数,1/0.45=2.22。 这个数值是会根据sensor和lens 特性,光照环境,甚至用户喜好来调整。Gamma 数值较大时,图像会很亮,但是对比度和饱和度会下降,感觉像有一层雾遮住了画面,同时暗处的Noise会被放大。Gamma很小时,亮度会降低,图像整体对比度增加,色彩更鲜艳,暗处的Noise较小,但是会让暗处的画面更暗而导致看不清内容。正是由于Gamma曲线在亮度较小的时候,映射曲线斜率很大,Noise也被同比例放大,所以才会有同一画面中暗处Noise比较明显的现象。

 

(左)低幅度                    (中) 中幅度                  (右)高幅度

Figure 2.4.3 不同gamma曲线幅度的效果比对

 

在实际的ISP设计中,不会真的去用上述的公式进行指数运算,一是计算速度不够,二是灵活度较低。一般都是用曲线映射的方式,可以用分段线性插值,也可以用SRAM逐一映射。这条曲线的形状可以任意配置,在调校图像的时候,一种方法是在灯箱拍摄24色卡,让色卡最下方的6个色块的亮度数据Y尽量呈现出线性等比例关系。这条曲线也可以随着环境变化而动态调整,特别是在低照度环境下,为了减小Noise而降低幅度。

 

Figure 2.4.4 24色卡下方6个方块的亮度


2.5 Brightness

亮度调整是一般摄像头都有的基本属性。通常都是在YCbCr空间对图像每个像素的Y都加上一个ΔY,ΔY可正可负。这样在增加亮度的时候会有明显的缺陷,图像的饱和度会降低,图像变白,视觉效果变差。根据RGB和YCbCR的转换公式可以分析出相同的结论:在Y上增加ΔY,等价于在R/G/B三个分量加上相同的ΔY。 我们常说的色彩鲜艳程度,非常近似于R/G/B之间的相互比例关系。当ΔY为正时,相当于R/G/B之间比例关系趋向于1,即差异变小,所以色彩变淡。那么要保持R/G/B比例关系,对R/G/B用乘法最好了,一样可以提高亮度。不过乘法也自己的问题,一是容易让较大的数据溢出,二是对暗处的亮度提升不明显。因此最好是加法和乘法做个融合,把亮度调整挪到RGB空间做,会有不错的效果。这里给出一个计算公式,对RGB三个分量独立计算,假设用户调整亮度为ΔY,x=R或者G或者B,ΔY 和R/G/G的取值范围都在0~255之间,a为可调参数,范围在0~1,建议为1/4.


f(x, ΔY) = x + a*ΔY + x*(1-a)*ΔY /256


我这个算法命名为基于色彩分量自身的亮度调整算法,效果图如下:

 

(左)原图                 (中)直接对Y加30         (右)采用上述公式增加亮度30

Figure 2.5.1 提高亮度


减小亮度的时候,也有类似的问题,直接对Y做减法的时候,暗处的内容就会丢失比较严重,同样可以采取在RGB空间加法和乘法结合的方式,有兴趣的可以自己实验看看。这种算法的映射曲线如下:

Figure2.5.2 亮度调整算法映射曲线

 

2.6 Anti-Flick

Flick是由于我们平常所用的交流电是50Hz或者60Hz(美国)的正弦波形,荧光灯辐射能量与此相关,人眼察觉不出来(神经网络刷新频率太低,还是视觉残留效应?),但是CMOS  sensor可以观察到,当拍摄被荧光灯照射的场景时就会容易有flick现象。如下图。这是一种垂直方向的正弦波,而且会随着时间滚动。

 

Figure2.6.1 flick 现象


要解释flick的成因,先要了解CMOS Sensor的曝光方式。Sensor 通常有全局曝光global shutter和滚动曝光rolling shutter两种。Global shutter是指整个Frame pixel在同一时间开始曝光,同一时间结束曝光,然后把数据通过接口传输出来,等数据传输完成之后,再开始下一个Frame的曝光。Rolling shutter是指Frame中各条line上的pixel 按照顺序依次开始曝光,先曝光完成的line 先传输,不必等整个frame都曝光完成。示意图如下。

 

Figure 2.6.2 global shutter & Rolling shutter
 

大部分sensor都支持这两种曝光模式,相比较而言,可以看到rolling shutter对时间的利用率较高,大部分时间可以被利用起来进行曝光。Rolling shutter的缺陷是当有物体高速移动的时候,拍摄到的物体会有变形,矩形变成平行四边形,这可以依照上图原理推断出来。Global shutter不会变形,主要用于拍照片,对fps没有太多要求,单张照片也不存在flick的问题。Rolling shutter用于拍视频,所以会存在flick问题。


Flick的原因在于荧光灯发出的能量在时间上是不均匀的,以我们国家50Hz为例,电压为50Hz正弦波,做平方运算转换到荧光灯的辐射能量,为100Hz的半弦波形状,如下图。假设某个frame的曝光时间为0.025s,即2.5个半弦波,由于采用rolling shutter,每条line的起始曝光时间不一致,Line A和line B可吸收的能量也不相同,Line B 要比Line A亮一些。这样在整个Frame 中就会有垂直方向的波浪纹。如果相邻Frame的间隔不是0.01s的整数倍,那么每条Line 在不同Frame接收的能量也会变化,这样看到的现象是波浪纹会随着时间在画面上滚动。

 

Figure 2.6.3 flick 成因


解决flick的方法很简单,只要限制曝光时间是0.01s的整数倍,那么任意像素吸收的能量都是一样的。然而在户外光照较强的时候,曝光时间为0.01s的时候就会导致过曝,户外也没有荧光灯,不需要强加这个限制,所以在ISP中需要一个检测机制,能够检测出flick的存在,当发现这种flick的时候才对曝光时间进行限制。检测flick没有统一的方法,可以自由发挥想象力,找到能准确检测flick并且不会误判的方法,正是ISP乐趣所在。

 

2.7 HDR

HDR的本意是高动态范围图像压缩。 我们知道一般CMOS sensor拍摄到的照片动态范围较人眼小很多,所以通过不同曝光时间拍摄同一场景的多张照片,实现动态范围扩展。前文提过曝光时间和图像亮度成正比,在已知多张照片曝光时间的条件下,可以把多张照片合成一张高动态范围的图片。举例来说,原始照片中图像内容的亮度范围都是0~255,合成之后亮度范围可能变成了0~1023,这幅高动态照片确实可以呈现所有的图像细节,不过一般显示器的显示范围只有0~255,无法直接显示出来。采用等比例压缩成0~255的话,图像细节丢失比较严重,于是出现了各种压缩动态范围的算法,既能完整呈现图像,又不损失细节。借用百度的图片。

 

Figure 2.7.1 三合一的HDR效果
 

先谈一下HDR的实现方法。通常我们所说的HDR都是指照片而不是视频,也就是说拍摄好几张不同曝光的照片存在系统的DRAM中,然后由CPU来计算合成,这是由SW来实现的,通常所需时间是秒级。HDR算法种类很多,效果较好的算法也意味着较高的计算复杂度。现在视频拍摄也需要HDR,CPU就容易算不过来,我这里分析一下由数字IC设计来实现HDR的可行性。


要视频HDR,首先需要CMOS sensor支持长短曝光模式,以长/短两种曝光图像合成为例,据我所知有两种输出格式,如下图。

 

Figure 2.7.2
 

对于依次传输的模式,要做二合一融合,必须要把长曝光的整幅图像先存起来,用SRAM的话显然面积会非常庞大,成本太高,因此需要存到系统的DRAM中,等短曝光的图像收到的时候再从DRAM中取出来。这样会占用DRAM的1个Frame存储空间,以及1次读Frame和1次写Frame的带宽。对于混合传输模式,除了可以同样采取把长曝光数据存储到DRAM中的方法以外,也具有把数据放入SRAM的可能性,这要看混合传输时block 大小。以FHD为例,假设先传输100 line的长曝光图像数据,再传输100 line的短曝光图像数据,需要把1920*100=192K个pixel存储到SRAM中,为了减小size,通常会在Bayer pattern domain做HDR合成,以pixel为10-bit为例,Total size为192K*10/8=240K bytes,成本或许可以接受。
 

HDR算法种类较多,我这里大概介绍一下基本思想。有基于直方图统计特征,进行亮度重新映射的方法,类似于直方图均衡化。有局部处理法,结合整体图像亮度和局部区域对比度,保留细节又压缩范围。有转换到对数域(人眼对亮度的敏感度类似对数关系)进行压缩的方法。有对图像进行分层,分为基础层和细节层,保留细节层,对基础层进行范围压缩的方法。各种方法可以相互融合借鉴,对于IC设计来说,最关键的还是性价比。
 

2.8 亮度小结

以上介绍了和图像亮度相关的ISP function,内容并不全面,还有一些对比度增强类的算法(例如去雾)没有描述,请大家包涵。下一章介绍图像色彩。

 

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
ISP和摄像头工作原理
CMOS摄像头调试
CMOS Sensor的调试经验分享
Camera 图像处理原理分析- 抗噪 变焦 频闪 等(转)
相机系统综述
ISP-黑电平校正(BLC)
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服