图像传感器与信号处理——自动曝光算法

  • 图像传感器与信号处理——自动曝光算法
  • 1. 如何实现自动曝光?
  • 2. 基于直方图统计的算法
  • 2.1 Acquisition of Agronomic Images with Sufficient Quality by Automatic Exposure Time Control and Histogram Matching,2013
  • 3. 基于熵的算法
  • 3.1 Camera Parameters Auto-Adjusting Technique for Robust Robot Vision,2010
  • 4. 基于梯度的算法
  • 4.1 Active Exposure Control for Robust Visual Odometry in HDR Environments,2017
  • 4.2 Gradient-based Camera Exposure Control for Outdoor Mobile Platforms,2018


图像传感器与信号处理——自动曝光算法

我是搞视觉SLAM的,在很久之前我和一位视觉SLAM大佬交流过,视觉SLAM难以落地原因有很多,其中之一就是环境光照对SLAM系统有较大的影响,而在实际的应用过程中,我们很难去真正控制环境中的光照变化,尤其是在室外。因此如何使得输入SLAM系统的图像具备稳定的光照就是非常值得研究的,而自动曝光就是其中一个非常重要的解决方案。这就是我这几天在家看这几篇论文的出发点。

1. 如何实现自动曝光?

自动曝光的过程是一个经典的反馈控制过程

首先,既然是控制我们就需要知道控制的是什么,对于一般的相机来说,和曝光相关的参数配置有光圈曝光时间增益等,其中光圈的配置必须通过硬件实现,因此在实际操作过程中一般只控制曝光时间增益来实现自动曝光。

其次,既然是反馈我们就需要建立一个标准来衡量曝光程度的优劣,而这个衡量标准定义的不同则意味着自动曝光算法的不同,下文就是据此对自动曝光算法进行分类,分别是基于直方图统计的算法、基于图像熵的算法、基于梯度的算法。

2. 基于直方图统计的算法

基于直方图统计的算法相关文章较多,而且都比较旧想法也比较简单,下面这些文章都是基于直方图统计的算法:
(1)An Advanced Video Camera System with Robust AF, AE, and AWB Control,2001
(2)Real-time Image Fusion and Adaptive Exposure Control for Smart Surveillance Systems,2007
(3) 2.3 Automatic Camera Exposure Control,2007
(4) 2.4 Autonomous Configuration of Parameters in Robotic Digital Cameras,2009
这里只对下面这篇比较新的一篇论文进行分析:

2.1 Acquisition of Agronomic Images with Sufficient Quality by Automatic Exposure Time Control and Histogram Matching,2013

这篇文章主要描述的是一个在农用机器人上应用的实际场景,最终目的是通过自动曝光实现农用机器人更加准确地识别稻田里面的特征。对于自动曝光算法,其在图像直方图的基础上有了进一步的改进,算法框架如下图所示:

自动曝光算法 opencv_直方图


除了通过图像直方图计算曝光时间外,还会通过直方图匹配对曝光后的图像进行进一步优化。这篇文章采用的归一化直方图,首先计算:自动曝光算法 opencv_自动曝光算法 opencv_02其中自动曝光算法 opencv_传感器_03的即直方图的横坐标,其范围是自动曝光算法 opencv_传感器_04自动曝光算法 opencv_信号处理_05自动曝光算法 opencv_算法_06是横坐标自动曝光算法 opencv_传感器_03在直方图中对应的值,自动曝光算法 opencv_传感器_08是平均值在此基础上可以计算方差自动曝光算法 opencv_自动曝光算法 opencv_09、偏度自动曝光算法 opencv_直方图_10和峰度自动曝光算法 opencv_传感器_11,这篇文章中用于Decision making的两个参数是平均值自动曝光算法 opencv_传感器_08和偏度自动曝光算法 opencv_传感器_13,如下所示:

自动曝光算法 opencv_直方图_14自动曝光算法 opencv_自动曝光算法 opencv_15其中自动曝光算法 opencv_算法_16自动曝光算法 opencv_传感器_17为图像第自动曝光算法 opencv_直方图_18个通道的均值和偏度(红绿蓝三个通道,但是由于农用场景的限制,这篇文章只考虑红和绿两个通道),自动曝光算法 opencv_传感器_19自动曝光算法 opencv_算法_20分别是均值的最大最小边界,自动曝光算法 opencv_自动曝光算法 opencv_21自动曝光算法 opencv_信号处理_22分别是偏度的最大最小边界。自动曝光算法 opencv_传感器_23自动曝光算法 opencv_自动曝光算法 opencv_24分别为参考图像的直方图平均值,通过上式就可以计算出优化后的曝光时间,即ET modification中的过程。
如果在Decision making中判定不需要进行曝光时间优化后就可以直接进行Image quality Improvement,其流程是分别计算输入图像和参考图像的直方图的累加概率自动曝光算法 opencv_信号处理_25通过累加概率进行匹配,然后搜索最接近的自动曝光算法 opencv_自动曝光算法 opencv_26值,然后用自动曝光算法 opencv_传感器_27改变自动曝光算法 opencv_传感器_28(这里论文中是这么说的,但是具体如何改变并没有举例说明,具体怎么实现的会有点不清楚)。

3. 基于熵的算法

基于熵的自动曝光算法相关的文章好像并不多,目前就找到这一篇比较有代表性的:

3.1 Camera Parameters Auto-Adjusting Technique for Robust Robot Vision,2010

这篇文章主要是介绍了一种基于图像熵的摄像机参数自动调节技术,根据香农定理信息内容可以通过熵进行描述,并且熵可以随着信息内容增加而增大。在RGB色域中计算图像熵,公式如下:自动曝光算法 opencv_传感器_29其中,自动曝光算法 opencv_直方图_30为RGB颜色通道的离散范围,自动曝光算法 opencv_信号处理_31分别是颜色自动曝光算法 opencv_直方图_32在图像中的概率,由上式可知自动曝光算法 opencv_算法_33文章中提到控制的参数为曝光时间和增益,那么通过实验可以测得图像熵随曝光时间和增益这两个参数变化的趋势如下图所示:

自动曝光算法 opencv_直方图_34

其中图中蓝色背脊线上的参数都是可以接受的,但是如上图所示的这种三维图是不方便搜索最佳参数的,因此在实际应用中,将曝光时间和增益设置为相同的数值,这样就可以将三维图转化为如下图所示的二维图:

自动曝光算法 opencv_算法_35


其中图(a)是室内测得的图像熵随参数变化的曲线,图(b)是室外测得的图像熵随参数变化的曲线,如图所示,图像熵随着参数呈单调递增再单调递减的变化趋势。因此搜索就变得简单,可以从一个较低的曝光时间和增益开始,以一定的步长朝峰值搜索,直到下一步的图像熵小于当前步,那么就寻找到了最优的曝光和增益。

4. 基于梯度的算法

这是最近几年比较热门的一种算法,起码对于SLAM来说,实验证明这些算法是有效的,这里分享两篇方法比较类似的文章:

4.1 Active Exposure Control for Robust Visual Odometry in HDR Environments,2017

题目直抒胸臆呀,就是通过自动曝光控制提高视觉里程计在高动态环境下的鲁棒性。这篇文章中提出了在视觉里程计中应用自动曝光需要解决的问题是,一方面需要最大化图像信息,另一方面需要补偿由于曝光时间调整带来的时间差

首先解决第一个问题,如何最大化图像信息,首先论文中定义了光度响应函数自动曝光算法 opencv_传感器_36其中,自动曝光算法 opencv_算法_37为图像的光照强度,辐照度自动曝光算法 opencv_算法_38描述了单位时间射入像素的能量,自动曝光算法 opencv_直方图_39为曝光时间,而这个函数本身自动曝光算法 opencv_自动曝光算法 opencv_40是很难有具体的表达式的,这也就是为什么在自动曝光系统中采用的多是反馈控制算法,如果有了光度响应函数的具体表达式,我们就可以通过这个表达式直接获得合适的曝光时间。在此基础上定义了逆响应函数自动曝光算法 opencv_信号处理_41这个逆响应函数并不是直接对响应函数求逆,那么光度响应函数的逆响应函数如下:自动曝光算法 opencv_传感器_42我们通过采集不同的曝光时间自动曝光算法 opencv_直方图_39的图像,并计算图像的光照强度自动曝光算法 opencv_算法_37,这样就可以看做获得了一组离散数据自动曝光算法 opencv_算法_45,然后利用这组数据采用十阶的多项式函数进行拟合函数 自动曝光算法 opencv_传感器_03,获得函数 自动曝光算法 opencv_传感器_03后可以进一步函数的微分形式自动曝光算法 opencv_算法_48,如下图所示就是这样一条曲线:

自动曝光算法 opencv_信号处理_49


有了这个基础后,下面进一步建立曝光程度的评价标准,论文中建立了四种标准,并对标准进行了讨论对比,首先将像素自动曝光算法 opencv_算法_50的梯度幅值定义为:自动曝光算法 opencv_算法_51其中自动曝光算法 opencv_传感器_52,那么四种标准分别是:

(1)直接求和自动曝光算法 opencv_直方图_53

(2)对数求和自动曝光算法 opencv_传感器_54其中自动曝光算法 opencv_直方图_55这种评价标准在下一篇论文中作更加详细的分析。

(3)百分位数自动曝光算法 opencv_传感器_56其中,自动曝光算法 opencv_自动曝光算法 opencv_57函数是求百分位数,例如当参数 自动曝光算法 opencv_信号处理_58 为0.5时,那么自动曝光算法 opencv_信号处理_59就是所有梯度幅值中的中位数。

(4)软百分位数自动曝光算法 opencv_自动曝光算法 opencv_60其中自动曝光算法 opencv_信号处理_61为图像中所有像素的数量,自动曝光算法 opencv_传感器_62为排好序的梯度幅值,而权重自动曝光算法 opencv_直方图_63定义如下:自动曝光算法 opencv_直方图_64其中符号自动曝光算法 opencv_算法_65为向下取整。

在论文中,通过对比FAST角点在各自标准下最优图像提取数量进行实验对比,发现百分位数标准软百分位数标准提取数量会更多,然后还通过下面这张图进行图进行直观效果说明,我觉得很有意思:

自动曝光算法 opencv_算法_66

从上到下分别是四个评价标准计算的值随曝光时间的变化曲线,可以看到,前两者是随着曝光时间单调上升,而在最顶点是已经出现了过曝光的情况,后两者则不会,曲线有极大值,而在极大值时图像曝光对于细节的保留确实较优。

最后说明如何根据评价标准光度响应函数进行自动曝光控制了,那么要做的就是将评价标准自动曝光算法 opencv_传感器_67对曝光时间自动曝光算法 opencv_直方图_39求导,然后通过梯度下降法求得极大值,那么不管采用上面哪种评价标准,中间都包括求自动曝光算法 opencv_传感器_69,那么有自动曝光算法 opencv_直方图_70根据二阶导数的对称性,有自动曝光算法 opencv_算法_71自动曝光算法 opencv_直方图_72就需要用到我们前面提到的光度响应函数自动曝光算法 opencv_传感器_73其中,最后一个等式是因为前面定义的逆响应函数自动曝光算法 opencv_直方图_74那么对自动曝光算法 opencv_传感器_03求导有自动曝光算法 opencv_算法_76将上式变形代入即可。因为自动曝光算法 opencv_直方图_77在一开始就介绍了如何通过采样拟合求得,那么最终自动曝光算法 opencv_传感器_69就可求得,就可以通过梯度下降法求得极大值。以自动曝光算法 opencv_自动曝光算法 opencv_79为例,我们可以求得其关于曝光时间自动曝光算法 opencv_直方图_39的导数有:自动曝光算法 opencv_传感器_81那么曝光时间的更新方式为:自动曝光算法 opencv_算法_82关于自动曝光的部分这篇文章就介绍到这里,文章后面一部分是进行曝光补偿,这个稍后介绍

4.2 Gradient-based Camera Exposure Control for Outdoor Mobile Platforms,2018

这篇文章中提出要解决的问题一方面是如何进行基于图像梯度的自动曝光控制,另一方面是如果实现多相机联合曝光

首先解决第一个问题,这篇文章提出,自然场景图像的梯度分布满足重尾分布,也就是场景中大部分梯度的幅值较小,大幅值梯度分布得少而离散。为了平衡梯度幅值与数量之间的关系,本文提出使用一个对数函数梯度进行映射:自动曝光算法 opencv_直方图_83其中,自动曝光算法 opencv_算法_84自动曝光算法 opencv_算法_85是像素 自动曝光算法 opencv_直方图_18 处的梯度幅值,可以看到当梯度小于阈值 自动曝光算法 opencv_直方图_87 时,梯度幅值映射为零。自动曝光算法 opencv_传感器_88是一个控制映射趋势的参数。自动曝光算法 opencv_自动曝光算法 opencv_89就代表梯度信息中和梯度幅值相关的部分,其输出控制在自动曝光算法 opencv_传感器_04自动曝光算法 opencv_直方图_91。那么图像的曝光评价标准就定义为:自动曝光算法 opencv_直方图_92自动曝光算法 opencv_传感器_67越大说明曝光效果越好,图像中包含的信息越多。接下来说明如何进行曝光控制,在利用当前曝光时间获得的图像进行自动曝光算法 opencv_算法_94矫正,即自动曝光算法 opencv_传感器_95,并求取最优的矫正值自动曝光算法 opencv_直方图_96自动曝光算法 opencv_直方图_97具体操作是在自动曝光算法 opencv_信号处理_98的范围里选取一些列的自动曝光算法 opencv_传感器_13值对当前图像进行自动曝光算法 opencv_传感器_13矫正,并计算矫正后的曝光程度自动曝光算法 opencv_传感器_67,然后利用五阶的多项式函数对这一系列离散值进行拟合,组中求得最优的矫正值自动曝光算法 opencv_直方图_96,如下图所示:

自动曝光算法 opencv_自动曝光算法 opencv_103

获得最优矫正值自动曝光算法 opencv_直方图_96后通过更新函数就可以直接对曝光时间进行更新,更新函数分为线性更新函数和非线性更新函数:

线性更新函数:自动曝光算法 opencv_直方图_105非线性更新函数:自动曝光算法 opencv_信号处理_106其中自动曝光算法 opencv_信号处理_107自动曝光算法 opencv_算法_108时刻的曝光水平,更新的最终结果是使得最优矫正值自动曝光算法 opencv_直方图_96趋近与自动曝光算法 opencv_直方图_91,这样就完成了整个反馈的控制。在此基础上,这篇文章一个很重要的贡献是实现了多相机的联合自动曝光,这里简单介绍下:自动曝光算法 opencv_传感器_111其中,优化函数将所需曝光量视为一元项自动曝光算法 opencv_自动曝光算法 opencv_112,并将重叠区域中的亮度相似度作为成对项自动曝光算法 opencv_信号处理_113自动曝光算法 opencv_传感器_114是两个相机之间的重叠区域,通过以上式为最优化目标进行优化操作就可以获得各个相机在联合自动曝光下最优曝光水平。

目前就看了这十篇左右的论文,看着看着又发现了近几年出的几篇很好的文章,是和SLAM相关的,考虑如何更好地将自动曝光算法和SLAM结合起来以提高系统的性能,很有意思。这篇博客就先写这么多,写得太长了自己都要看吐了,接下来把新的几篇论文看完再重新总结下,