域名不卖,勿扰!

Sensor Flicker(banding现象)

一、Flicker现象:

我们室内日光灯下拍照的时候,有没有遇到过这样的现象?是什么原因呢。

二、为了解释这个现象,我们先来了解几个概念:

1、Rolling shutter(卷帘快门)和Global shutter(全局快门)
卷帘快门是逐行曝光;全局快门是所有像素同时曝光。

2、曝光时间:

曝光时间
global shutter方式中得曝光时间很容易理解就不多说,rolling shutter的曝光时间是指从一行开始重置到一行开始读出的时间就是曝光时间,切记是一行的时间,不是整个画面所有像素都读完的时间。
实际上,也就是每个像素能够积累光信号的时间。

rolling shutter方式曝光虽然是逐行进行,但是并不是前一行数据读取完成后再进行下一行数据的重置,曝光,读取过程。整个过程其实可以简单理解为当上一行数据再曝光的过程中,下一行就开始重置并读取数据,并不用等到上一行数据完全读取再进行,这一点有点像甘特图,可以看上面提到的博客中的图形理解。

三、Flicker产生的原因:

原因是由于sensor在光照条件下,不同像素点上的所接受的光能量不同,也就是图像的亮度不同。由于传感器 sensor 的曝光方式是通过一行一行的方式进行的,任何一个像素点的曝光时间是一样的,也就是同一行上的每个 像素点的曝光开始点和曝光的时间都是一模一样的,所以同一行的所有像素点所接收到的光能量是一样的,而在不同行之间虽然曝光时间都是一样的,但是曝光的开始点是不同的,所以不同行之间所接受到的能量是不一定相同的。

四、解决方案:曝光时间设置成1/100s的整倍数。

如图用两帧中的两行曝光来示意一下。因为现在sensor一般采用rolling shutter的方式,所以对于同一行的所有像素的开始曝光时刻和曝光时间时一致,也就是同一行的像素就收的能量时一样的。如图是当曝光时间低于能量周期整数倍的时候的示意图。第一帧的第一行曝光用矩形ABCD来表示,那么第一行像素所接受的能量就是ABCD矩形下sin函数的面积,第一帧第二行曝光用矩形EFGH来表示,那么同理这一行的能量用EFGH下sin函数的面积表示,学过三角函数的同学应该就能清楚这两个矩形与三角函数交点之间的积分是不等的,也就是面积不等,也就导致这两行就收的能量不同,同时延申到所有行,那么一帧图像中就会出现有规律的明暗变化。那么对于第二帧图像而言,第一行曝光在A1B1C1D1矩形,同理接受的能量就是这个矩形下三角函数的面积,同理可以推到出A1B1C1D1矩形下三角函数的面积和ABCD矩形下三角函数的面积不一样,这就导致第二帧图像和第一帧图像的第一行的能量也不相同,这也就导致了在视频预览时会又明暗条纹滚动的现象出现。上面的分析就是flicker现象的原因。

为了使不同行之间所接受的能量相同,就必须找一个特定的条件,使得每一行即使曝光开始点不同,但是所接受的光能量是相同的,这样就避开了 flicker现象,这个特定的条件就是曝光时间必须是光能量周期的整数倍时间。以50Hz的光源为例,光能量周期就是光源周期的一半,即1/100s。

下面看看当曝光时间是工频周期整数被的情况

同理还是用50Hz和30fps来示意。如图所示,当为工频周期的整数倍的时候,每一行就收的能量都是工频能量曲线一个周期的面积,然后根据sin函数的周期性可以求得ABCD,EFGH,A1B1C1D1, E1F1G1H1四个矩形下的三角函数的面积是一样的,也就不会导致每一行就收的能量不一致,从而消除flicker现象。

五、无法规避的场景:

在实际应用中有的时候在室内环境光线很强的时候,曝光时间必须低于0.01s,当曝光时间为最小的0.01s是图像就会过曝,那么此时AE就会把曝光时间降低到能量周期整数倍以下,那么这种情况下理论上是无法解决flicker问题。

但是此时一般会通过将帧率降低到25fps来固定条纹,就让条纹不滚动,然后实际应用场景中物体的亮度本身也是渐变的,所以有的应用中通过这种固定得方式是可以接受的。

具体原理通过下图来示意

如图可以看出第一帧的第一行和第二行同上面讨论30fps一样,接受到的能量是不同的,所以亮暗条纹还是会存在,但是当帧率为25fps时,第二帧的第一行和第一帧的第一行接受的能量时一致的,第二行同理也是一致的,所以不会导致画面出现滚动的现象,也就是把flicker固定住了。

参考链接:
https://blog.csdn.net/wtzhu_13/article/details/118026033
https://blog.csdn.net/abcwoabcwo/article/details/93099982

版权共享,随意转载:云破天开 » Sensor Flicker(banding现象)

评论

3+8=