自动曝光算法原理与实现介绍

相机的自动曝光(AE)算法实际上是通过自动调整曝光时间,使得获取到的图像达到一个合理的灰度范围,比如opencv自动曝光算法aeb_opencv自动曝光算法aeb。典型的判断灰度是否合理的方法是计算图像的灰度均值是否在140附近。

图像像素均值计算

设图像宽高分别为opencv自动曝光算法aeb_灰度_02, opencv自动曝光算法aeb_opencv自动曝光算法aeb_03处的灰度大小为opencv自动曝光算法aeb_计算机视觉_04。图像左上角的点坐标为opencv自动曝光算法aeb_灰度_05

  1. 直接均值法
    直接计算均值:
    opencv自动曝光算法aeb_opencv自动曝光算法aeb_06
  2. 高斯加权均值 - 图像中心点附近的灰度值更接近140。
    对图像位置进行加权,靠近中心处的像素拥有更高的权重,权值分布为二元高斯分布
    opencv自动曝光算法aeb_计算机视觉_07
    ,其中opencv自动曝光算法aeb_图像处理_08为图像的中心点位置,如果图像为opencv自动曝光算法aeb_算法_09大小,那么opencv自动曝光算法aeb_灰度_10, 实验表明当opencv自动曝光算法aeb_灰度_11时,概率opencv自动曝光算法aeb_图像处理_12非常小。因此采用这组参数作为图像的像素位置权重。那么图像像素的加权均值为:
    opencv自动曝光算法aeb_灰度_13
    其中opencv自动曝光算法aeb_opencv自动曝光算法aeb_14为概率密度函数,由于所有像素点的位置相加不等于1, 因此需要除以此项。
  3. 垂直方向渐变加权 - 适用于地空图像,地面位于图像下方,拥有更高的权重,天空位于图像上方,拥有较少的权重
    图像第opencv自动曝光算法aeb_opencv自动曝光算法aeb_15行的权重为opencv自动曝光算法aeb_opencv自动曝光算法aeb_16,那么图像的灰度均值为:
    opencv自动曝光算法aeb_灰度_17

Binary Search

二分搜索算法的过程,令曝光时间为ET:

  1. 计算图像的灰度均值mP;
  2. 如果opencv自动曝光算法aeb_算法_18,则不调整ET;
  3. 如果opencv自动曝光算法aeb_opencv自动曝光算法aeb_19,则ET更新为当前ET的一半;
  4. 如果opencv自动曝光算法aeb_图像处理_20并且当前ET已达到最大ET,则ET调整为最大ET - 1;
  5. 如果opencv自动曝光算法aeb_图像处理_20并当前ET未达到最大ET,则ET调整为当前ET + [0, 最大ET - 当前ET]中的一个正态分布的随机数。
    核心代码如下:
uint BinarySearchAEStrategy::updateET(QImage *image, uint oldET)
{
    uint uET = oldET;
    uchar m_pix = __meanPixelStrategyFunc__(image);
    int diff = (int)m_pix - ett;
    if (abs(diff) <= ett_float_range)
        return uET;
    if (diff > ett_float_range) // 折半减小曝光
        uET >>= 1;
    else if(diff < -ett_float_range && uET > max_et - 1) // 限制曝光为最大曝光值-1
        uET = max_et - 1;
    else if (diff < -ett_float_range && uET < max_et - 1) // 曝光补足,且限制曝光最大值
        uET += (uint) min(max(0, norm_dist(random_engine) * (max_et - uET)), max_et - uET - 1);
    return uET;
}

Fast and Robust Camera’s Auto Exposure Control Using Convex or Concave Model

复现论文Fast and Robust Camera’s Auto Exposure Control Using Convex or Concave Model中关于曝光时间调整的计算方法。核心代码如下:

uint FRAEStrategy::updateET(QImage *image, uint oldET)
{
    uchar pix = __meanPixelStrategyFunc__(image);
    if (abs((int)pix - ett) <= ett_float_range)
        return oldET;
    if (oldET == max_et)
        oldET = max_et - 1;
    // According to equation (5) to update ET
    // f_t = ett = 140
    uint updateET = (256. - pix) * oldET * max_et /
            (((double)ett - pix) * oldET + (256. - ett) * max_et);
    return updateET;
}

下面介绍其原理:该文提出的自动曝光算法将亮度特征建模成关于曝光控制参数的凸/凹函数。该函数决定了针对一个预定义的亮度等级(比如平均灰度140)的控制参数计算方法。

以一个例子来说明该方法的过程:

opencv自动曝光算法aeb_灰度_22

设上图中横坐标opencv自动曝光算法aeb_计算机视觉_23为曝光速度(也就是曝光时间的倒数),纵坐标opencv自动曝光算法aeb_灰度_24为灰度等级。我们不知道曝光速度和灰度等级之间的函数关系式,但显然,opencv自动曝光算法aeb_灰度_24是一个单调递减函数,该文还假设opencv自动曝光算法aeb_灰度_24是一个凸/凹函数,但实际上不必做如此假设。假设opencv自动曝光算法aeb_opencv自动曝光算法aeb_27是我们要求的的目标函数的根,opencv自动曝光算法aeb_算法_28是一个给定值,那么由数值分析方法可以迭代求解出opencv自动曝光算法aeb_opencv自动曝光算法aeb_27,文中采用的是修正的正割法,即只需要当前曝光速度下的图像灰度值作为初始值即可,而不用原始正割法(原始正割法需要两个参数)。