自动曝光

自动曝光通过调整增益和曝光时间来优化图像的亮度。

自动曝光在相机中进行的话则减少了CPU后期的处理运算。

什么是目标灰度值(曝光值)

目标灰度值是一个参数,通过调整亮度,来实现在多种光线强度下输出优化后的图像结果
该值是线性的,是最大像素值的百分比。

在各种数码相机中,目标灰度值称为曝光值,是根据光圈大小、f-stop 和快门时间估算的。

如何辨别曝光值是否正确

图像像素强度通常用 n 位表示。常见的有 8 位、10 位或 16 位像素格式
单色图像每个像素有一个通道,而彩色图像通常每个像素有三个通道(R、G、B)。
将图像像素值在直方图中合并以显示图像的像素强度分布。
通过这种方式可以指示出图像何时曝光不足、正确曝光或曝光过度

下面的例子分别展示 一个 曝光不足,曝光过度和正确曝光的图像,并在下方给出其像素的直方图。

看图像的曝光是否合理一般常用看直方图的方式
在这里插入图片描述
在这里插入图片描述
上面是曝光不足的图片和直方图,可以明显的看到直方图大部分集中在左侧,这代表着相机传感器没有捕捉到足够的光来正确的消除黑暗区域

在这里插入图片描述
在这里插入图片描述
上面的图片是过度曝光的,直方图大部分集中在左侧,意味着,一些像素过饱和,像素信息丢失或被剪裁。

在这里插入图片描述
在这里插入图片描述
上面的图是曝光正确,可以看到直方图接近128,处在中间区域,代表着该图像曝光值合适,丢失数据信息最少。

自动曝光是工作流程

有三个图像参数影响相机的曝光:

  • 增益
  • 曝光时间
  • 虹膜(不是标准的 GenICam 功能)

自动曝光的步骤如下:

  • 1 以一个默认的参数值进行曝光获取图像
  • 2 创建直方图并比较统计的数据
    使用直方图比较图像统计信息。
    将得到的直方图与最佳均值和方差进行比较以确定最佳曝光。
    如果平均值/方差不在最佳范围内,则相机会调整增益或曝光。

就像下面的图一样,形成控制回路
在这里插入图片描述
可以自动设置最佳图像均值或使用目标灰度值定义它,该值控制图像直方图均值所在的位置。
目标灰度值是像素格式最大值的百分比。

例如,对于目标灰度值设置为 50% 的 8 位像素格式,增益和曝光时间通过一些分线性函数(例如gamma或者LUT)自动调整使得直方图的均值在128,来对图像进行曝光

当目标灰度值为自动设置时,相机基于图像像素方差确定最优均值。
这个模式下,增益、曝光时间和目标灰度值可以设置上下限。

当目标灰度值自动设置关闭的时候,可以自定义均值。可以通过使用曝光值计算这个均值,进行补偿。

曝光值是一种手动调整目标灰度值来适应特殊情况(比如阳光或者阴影),曝光值由-3到3

  • 3 调整增益和曝光时间
    当直方图和最佳灰度值不匹配的时候需要调整增益和曝光时间这两个图像参数

增益将传感器光子转换输出(电子)转换为数字值。数字值与增益设置成正比,因此单位位变化所需的电子数与增益设置成正比。白平衡是对传感器 R、G 和 B 输出差异的增益补偿。自动曝光考虑了白平衡的增益变化。

曝光时间(快门)决定了传感器收集光子并将其转换为电子的时间量。 它控制传感器收集多少光。

除了这些功能之外,还可以通过自动曝光启用两个附加功能,即减震和优先控制,以提供对自动曝光算法的补充控制。

如何设置自动曝光

Flir工业相机的上位机SpinView和Spinnaker API 提供了几种方法来配置自动曝光。

用SpinView配置自动曝光

下面是通过SpinView来开启自动曝光的方法:

  • 1 打开 SpinView 应用并且进入设置菜单
  • 2 设置Exposure Auto 为 Continuous
  • 3 设置Gain Auto 为 Continuous
    在这里插入图片描述
    可以在 SpinView 中设置的其他可选自动曝光相关功能如下所示,进入配置界面就是点击 Features 菜单然后选择 Auto Algorithm Control.
    在这里插入图片描述

    通过Spinnaker API 来配置自动曝光

    下面是通过Spinnaker API 来配置自动曝光的C++例程

将 Automatic Exposure Time和Gain Auto 设置为自动模式

//设置 Exposure time mode 为自动模式
CEnumerationPtr ptrExposureAuto = nodeMap.GetNode("ExposureAuto");
CEnumEntryPtr ptrExposureAutoCts = ptrExposureAuto->GetEntryByName("Continuous");
ptrExposureAuto->SetIntValue(ptrExposureAutoCts->GetValue());

//设置 gain 为自动模式
CEnumerationPtr ptrGainAuto = nodeMap.GetNode("GainAuto");
CEnumEntryPtr ptrGainAutoCts = ptrGainAuto->GetEntryByName("Continuous");
ptrGainAuto->SetIntValue(ptrGainAutoCts->GetValue());

感兴趣区域 (ROI) 可以应用于自动曝光功能。 这个 AE ROI 可以等于或小于捕获的 ROI 的面积。

//自动曝光 ROI
//开启 ROI用于白平衡
CBooleanPtrptrAasRoiEnable = nodeMap.GetNode("AasRoiEnable");
ptrAasRoiEnable-> SetValue(1);
CEnumerationPtr ptrAutoAlgorithmSelector = nodeMap.GetNode("AutoAlgorithmSelector");
CEnumEntryPtr ptrAutoAlgorithmSelectorAWB = ptrAutoAlgorithmSelector ->GetEntryByName("AutoWhiteBalance");
ptrAutoAlgorithmSelector->SetIntValue(ptrAutoAlgorithmSelectorAWB->GetValue());

//设置ROI的尺寸和偏移 
CIntptrptrAasRoiHeight = nodemap.GetNode("AasRoiHeight");
ptrAasRoiHeight->SetValue([insert ROI height]);
CIntptrptrAasRoWidth = nodemap.GetNode("AasRoiWidth");
ptrAasRoiWidth->SetValue([insert ROI width]);
CIntptrptrAasRoiOffsetX = nodemap.GetNode("AasRoiOffsetX");
ptrAasRoiOffsetX->SetValue([insert X offset]);
CIntptr ptrAasRoiOffsetY = nodemap.GetNode("AasRoiOffsetY");
ptrAasRoiOffsetY->SetValue([insert Y offset]);

目标灰度值设置为自动(continuous)允许相机根据图像方差确定最佳平均值。

//目标灰度值设置为自动
CEnumerationPtr, ptrAutoXTargetGreyValueAuto = nodeMap.GetNode("AutoExposureTargetGreyValueAuto");
CEnumEntryPtr ptrAutoXTargetGreyValueAutoCts = ptrAutoXTargetGreyValueAuto ->GetEntryByName("Continuous");
ptrAutoXTargetGreyValueAuto -> ptrAutoXTargetGreyValueAutoCts ->GetValue());

当图像中的照明不均匀时,照明模式会调整曝光值以适应图像直方图中的特征。 标准设置为正常。 另外两个选项是背光补偿和前光补偿:

背光补偿:
当强光从物体后面射进来时,使用背光补偿模式。 在这种情况下,自动曝光算法会使对象曝光不足。 实施背光补偿调整成像参数以正确曝光图像,而不管物体相对于相机和照明位置的位置。

//背光补偿
CEnumerationPtr ptrAutoXLightingMode = nodeMap.GetNode("AutoExposureLightingMode");
CEnumEntryPtr ptrAutoXLightingModeBacklight=ptrAutoXLightingMode->GetEntryByName("Backlight");
ptrAutoXLightingMode->SetIntValue(ptrAutoXLightingModeBacklight->GetValue());

前光补偿:
当物体前方有强光照射而背景较暗时,使用前光补偿模式。 在这种情况下,自动曝光算法会使对象过度曝光。 前光补偿调整成像参数以正确曝光图像,而不管物体相对于相机和照明的位置的位置。

//前光补偿
CEnumerationPtrptrAutoXLightingMode = nodeMap.GetNode("AutoExposureLightingMode");
CEnumEntrPtr ptrAutoXLightingModeFrontlight=ptrAutoXLightingMode->GetEntryByName("Frontlight");
ptrAutoXLightingMode->SetIntValue(ptrAutoXLightingModeFrontlight->GetValue());

设置各种自动曝光参数限制,设置目标灰度值下限和上限。

//目标灰度值范围设置
CFloatPtr ptrAutoXGreyValueLowerLimit = nodeMap.GetNode("AutoExposureGreyValueLowerLimit");
ptrAutoXGreyValueLowerLimit->SetValue([insert lower limit]);
CFloatPtr ptrAutoXGreyValueUpperLimit = nodeMap.GetNode("AutoExposureGreyValueUpperLimit");
ptrAutoXGreyValueUpperLimit->SetValue([insert upper limit]);

//增益范围设置
CFloatPtr ptrAutoXGainLowerLimit = nodeMap.GetNode("AutoExposureGainLowerLimit");
ptrAutoXGainValueLowerLimit->SetValue([insert lower limit]);
CFloatPtr ptrAutoXGainValueUpperLimit = nodeMap.GetNode("AutoExposureGainUpperLimit"); ptrAutoXGainValueUpperLimit->SetValue([insert upper limit]);

//曝光时间限制
CFloatPtr ptrAutoXExposureTimeLowerLimit = nodeMap.GetNode("AutoExposureExposureTimeLowerLimit");
ptrAutoXExposureTimeLowerLimit->SetValue([insert lower limit]);
CFloatPtr ptrAutoXExposureTimeUpperLimit = nodeMap.GetNode("AutoExposureExposureTimeUpperLimit ");
ptrAutoXExposureTimeUpperLimit->SetValue([insert upper limit]);

相机优先保持增益
使用此模式可将噪音降至最低。 相机保持尽可能低的增益,并根据目标灰度调整曝光时间。 如果在达到目标灰度级之前达到最大曝光,则增益开始增加,直到达到目标灰度级。

//相机优先处理增益
CEnumerationPtr ptrAutoXControlPriority = nodeMap.GetNode("AutoExposureControlPriority");
CEnumEntryPtr ptrAutoXControlPriorityGain = ptrAutoXControlPriority->GetEntryByName("Gain");
ptrAutoControlPriority->SetIntValue(ptrAutoXControlPriorityGain->GetValue());

相机优先保持曝光时间
使用此模式捕捉快速动作。 选择它时,相机保持尽可能短的曝光时间,并根据目标灰度值调整增益。 如果在达到目标灰度级之前达到最大增益,则曝光时间会改变,直到达到目标灰度级。

//优先保持曝光时间
CEnumerationPtr ptrAutoXControlPriority = nodeMap.GetNode("AutoExposureControlPriority");
CEnumEntryPtr ptrAutoXControlExposureTimePriority = ptrAutoXControlPriority->GetEntryByName("ExposureTime");
ptrAutoControlPriority->SetIntValue(ptrAutoXControlExposureTimePriority ->GetValue());