《Exposure Evaluation Method Based on Histogram Statistics》文献详细总结

翻译至论文《Exposure Evaluation Method Based on Histogram Statistics》

摘要 :针对成像系统在无明确前景、无明确背景场景下存在的过曝、欠曝问题,本文提出一种基于直方图的曝光评价方法。通过分析不同曝光图像直方图的统计特征,采用以中灰为参考点的三阶矩来评价曝光效果。针对彩色图像,为兼顾运算效率,仅选取平均亮度最大的颜色通道计算直方图。实验结果表明:该方法无需图像数据库即可完成曝光效果评价,算法复杂度低,易于工程实现。

关键词:曝光评价;图像直方图;三阶矩;中灰

一、引言

在消费级数码相机中,自动曝光(AE)是图像流水线的重要处理模块。自动曝光模块通过自动调节相机曝光量以输出亮度合适的图像。要实现相机曝光自动调节,需要一套反馈系统,依据当前图像的曝光评价结果更新相机曝光参数。因此,曝光评价方法是自动曝光系统的核心。

现有方案主要分为两类。 第一类是基于参考亮度的方法:曝光时间越长,图像亮度越高;将当前图像亮度和某一参考亮度做对比,以此完成相机曝光调节。例如文献 1 将图像切分为若干子图,利用子图平均亮度确定参考亮度,再调节光圈大小达到目标参考亮度;类似思路也被用于快门速度调节。显然,单纯依靠平均亮度的方法适用范围有限。除简单的平均亮度指标外,矩阵测光、中央加权测光、信息熵、梯度等各类评价手段,被用于基于图像亮度确定曝光值;文献 2‑6 给出大量由实验总结得到的亮度‑曝光关系与规则。

第二类被部分相机厂商采用的方法:基于样本实例学习的方案,利用大量图像样本学习不同光照条件下亮度与曝光的映射关系 7‑9。相比第一类方法,样本学习方案鲁棒性更强,因为它覆盖了大量不同光照、不同拍摄场景。但该方案必须依赖大规模不同光照下采集的图像数据库。

此外,传统算法适合前景、背景清晰可分的场景。但对于森林、海洋、山地这类没有明确前景、背景的特殊场景,传统方法很难输出合理的曝光等级。

图像质量与图像直方图紧密相关。曝光良好的图像灰度分布均匀,直方图两端不存在像素溢出;利用直方图还可以求解图像均值、方差、最大最小亮度。因此已有不少工作采用直方图做曝光评价 10‑15。但这些文献大多聚焦于感兴趣区域(ROI)的曝光评价。文献 14 依靠判断直方图两端是否存在像素评价曝光效果,该方法极易受噪声干扰。

为解决上述问题,本文利用直方图偏斜特性判断曝光是否合适。在计算偏度时,不以图像均值做偏差基准,而是以参考亮度计算三阶矩。实验证明本文所提方法有效。

二、基于直方图统计的曝光评价方法

大量实验表明:低对比度图像的直方图大多呈单峰形态;部分无明确前景、背景的特殊场景,直方图同样为单峰。这两类场景下物体与背景很难区分,传统曝光评价方法无法得到合适曝光。本文针对直方图呈单峰的图像,提出基于三阶矩的曝光评价算法。

A 矩的基本概念

矩在图像分析领域应用广泛,可用来得到针对特定变换具备不变性的特征。矩是对点集形状的定量描述。若点集代表概率密度,则零阶矩代表总概率;一阶矩代表均值;二阶中心矩代表方差;三阶矩表征偏度。

随机变量x的实函数(f(x))相对于参考点C的n阶矩定义:

概率密度函数(f(x))关于零点的n阶矩称为原始矩,是\(X^n\)的数学期望。关于均值(C取均值)的矩称为中心矩,中心矩描述函数分布形状,不受平移影响。阶数大于等于 2 时,一般优先使用中心矩而非原始矩。中心矩是随机变量相对于均值偏差整数次幂的期望,因此可以更清晰地描述分布形状。

一阶中心矩恒等于 0;二阶中心矩即方差;三阶中心矩用于定义标准化矩,用来表征分布的偏斜程度。对称分布的三阶中心矩等于 0;左拖尾(左侧尾巴更长)分布,偏度为负;右拖尾(右侧尾巴更长)分布,偏度为正。

B 本文算法

灰度分布均匀的图像动态范围高、对比度高、画面清晰;灰度均匀则分布呈对称形态。A 小节已经说明:对称分布的三阶中心矩等于 0。实验同时表明:灰度分布越均匀,直方图偏度越趋近于 0,直方图非双峰的图像该现象尤为明显。因此本文利用直方图偏度衡量灰度分布均匀程度。

三阶中心矩描述直方图相对于图像自身均值 的偏斜。但图像自身的平均亮度并不能代表正确曝光的亮度。**曝光是否准确,取决于灰度分布相对于参考亮度的对称性,而不是相对于图像自身均值的对称性。**由此启发,将三阶矩与参考亮度结合完成曝光效果评价。

绝大多数场景的整体亮度对应 18% 反射率的中灰。多数情况下以中灰亮度作为目标,可以得到合适曝光,因此选取中灰作为参考亮度。本文提出结合三阶矩与中灰的曝光评价方法。

设U为大小图像;代表图像灰度值。图像U的直方图定义:

式中 :灰度等于的像素总数量。

设代表第i帧图像;第i帧直方图:

为第i帧中灰度值等于的像素数目。

令C代表中灰,相对于参考点C的三阶矩定义:

本文中 8bit 图像中灰取。

对于第i帧图像\(U_i\),相对于中灰的三阶矩:

采用该中灰三阶矩\(\mu(i)\)评价第i帧曝光效果:

  1. :分布左偏,图像太暗(欠曝);
  2. :分布右偏,图像太亮(过曝);
  3. :分布对称,曝光正确。

表示第i帧曝光时间,第\(i+1\)帧曝光时间迭代调节规则:

代表曝光时间调节步长。

彩色图像处理:每一帧都对全部颜色通道统计直方图会带来巨大时间开销。为提升效率,只选择平均亮度最大的颜色通道,计算该通道直方图。

三、实验结果

本章节使用一组树叶(Leaves)彩色图像验证算法性能。图像三通道均为 256 级灰度,0 代表最暗,255 代表最亮。全部实验基于 Vc++6.0 平台完成。选取信息熵、均值法这两种传统曝光评价准则作为对比。

本实验固定场景,通过设置不同曝光时间,得到多幅不同曝光等级的图像。 实验传感器 CMV20000;帧率 25fps 条件下曝光时间调节范围 。部分图像见图 I。本实验中绿色 G 通道在 RGB 三通道内平均亮度最大,出于效率考量,仅使用 G 通道计算。图 II 为图 I 中各图像 G 通道对应的直方图。表 I 记录 G 通道各项指标,包括均值、信息熵、以均值为参考的三阶矩(三阶中心矩) ,以及以中灰为参考的三阶矩;计算使用图像全部像素。

图 I:不同曝光时间下采集的树叶图像 (1)\(T=2000\mu s\);(2)\(T=2596\mu s\);(3)\(T=3100\mu s\);(4)\(T=3500\mu s\);(5)\(T=4500\mu s\);(6)\(T=5500\mu s\)

如表 I 所示:第一张图像画面非常暗。随着曝光时间增加,图像均值不断增大(见表 I),画面越来越亮。图 I 的第 (5)、(6) 幅图像明显过曝。

表 I:不同曝光时间树叶图像实验结果

帧序号 i 曝光时间\(T_i(\mu s)\) 均值 熵 以均值为中心的三阶矩 以中灰为中心的三阶矩
1 2000 89.165 6.6536 0.4400 -1.8183
2 2380 99.1397 6.7910 0.6041 -1.0230
3 2500 106.3812 6.9407 0.6595 -0.5960
4 2596 114.5455 7.0475 0.7754 -0.0529
5 2740 121.8217 7.1119 0.7788 0.4022
6 3100 132.7647 7.1883 0.7890 1.1781
7 3500 153.3941 7.2576 0.6777 3.2415
8 4000 171.9556 7.1216 0.3876 6.2640
9 4500 191.1391 6.7641 -0.1595 10.1888
10 5000 206.4181 6.0698 -0.5284 14.1927
11 5500 219.9274 5.1766 -0.6890 18.0179
12 6000 232.4526 4.1512 -0.6300 22.1286

从表 I 可以看出:信息熵在曝光时间等于(3500\mu s)时达到峰值。如果采用熵准则,图 I (4) 会被判定为最佳曝光图像。同时,以均值为中心的三阶矩在曝光(4500\mu s)时最接近 0,依据该指标则图 I (5) 是最佳曝光图像。但主观看图,图 I (4)、图 I (5) 已经明显过曝。

当曝光时间\(3100\mu s\)时,图像均值 132.7647,非常接近中灰 128。按照均值法,图 I (3) 是最优曝光图像。而本文提出的中灰三阶矩,在曝光\(2596\mu s\)时最接近 0,按照本算法判定图 I (2) 为最佳曝光。

对比图 I (2) 和图 I (3):图 I (3) 整体更亮,图像中下部已经出现过曝;同时看图 II 直方图,图 I (3) 直方图向右偏移,动态范围相比图 I (2) 更低。因此图 I (2) 成像效果优于图 I (3)。

此外,图 II 可见,图 I (4)(5)(6) 的直方图均呈右偏。曝光改变过程中,直方图由左侧逐步向中间移动,再进一步偏移至最右侧;对应中灰三阶矩的绝对值先减小后增大。直方图偏度越趋近于 0,图像动态范围越高。 本测试场景只有绿叶、黄花,不存在明确前景、背景,直方图近似单峰。实验结果表明:和其他方法对比,基于中灰的三阶矩可以输出更优曝光等级。因此该指标对直方图单峰图像的曝光评价是有效的。

图 II:图 I 图像绿色通道直方图 (1)\(T=2000\mu s\);(2)\(T=2596\mu s\);(3)\(T=3100\mu s\);(4)\(T=3500\mu s\);(5)\(T=4500\mu s\);(6)\(T=5500\mu s\)

综上,实验证明,以中灰为参考点的三阶矩可以用于直方图为单峰图像的曝光效果评价。

四、结论

本文提出一项全新曝光评价判据,用于自动曝光控制系统;该判据基于相对于中灰的三阶矩。实验结果表明,该评价指标适合直方图呈单峰形态图像的曝光质量评估。

五、代码实现

python 复制代码
"""
File: auto_exposure.py
Description: 3A-AE Runs the Auto exposure algorithm in a loop
Code / Paper  Reference: https://www.atlantis-press.com/article/25875811.pdf
                         http://tomlr.free.fr/Math%E9matiques/Math%20Complete/Probability%20and%20statistics/CRC%20-%20standard%20probability%20and%20Statistics%20tables%20and%20formulae%20-%20DANIEL%20ZWILLINGER.pdf
Author: 10xEngineers Pvt Ltd
------------------------------------------------------------
"""
import time
import numpy as np


class AutoExposure:
    """
    Auto Exposure Module
    """

    def __init__(self, img, sensor_info, parm_ae):
        self.img = img
        self.enable = parm_ae["is_enable"]
        self.is_debug = parm_ae["is_debug"]
        self.center_illuminance = parm_ae["center_illuminance"]
        self.histogram_skewness_range = parm_ae["histogram_skewness"]
        self.sensor_info = sensor_info
        self.param_ae = parm_ae
        self.bit_depth = sensor_info["bit_depth"]

        # Pipeline modules included in AE Feedback Loop
        # (White Balance) wb module is renamed to wbc (white balance correction)
        # gc (Gamma Correction) module is renamed to gcm (Gamma Correction Module)

    def get_exposure_feedback(self):
        """
        Get Correct Exposure by Adjusting Digital Gain
        """
        # Convert Image into 8-bit for AE Calculation
        self.img = self.img >> (self.bit_depth - 8)
        self.bit_depth = 8

        # calculate the exposure metric
        return self.determine_exposure()

    def determine_exposure(self):
        """
        Image Exposure Estimation using Skewness Luminance of Histograms
        """

        # plt.imshow(self.img)
        # plt.show()

        # For Luminance Histograms, Image is first converted into greyscale image
        # Function also returns average luminance of image which is used as AE-Stat
        grey_img, avg_lum = self.get_greyscale_image(self.img)
        print("Average luminance is = ", avg_lum)

        # Histogram skewness Calculation for AE Stats
        skewness = self.get_luminance_histogram_skewness(grey_img)

        # get the ranges
        upper_limit = self.histogram_skewness_range
        lower_limit = -1 * upper_limit

        if self.is_debug:
            print("   - AE - Histogram Skewness Range = ", upper_limit)

        # see if skewness is within range
        if skewness < lower_limit:
            return -1
        elif skewness > upper_limit:
            return 1
        else:
            return 0

    def get_greyscale_image(self, img):
        """
        Conversion of an Image into Greyscale Image
        """
        # Each RGB pixels with [0.299, 0.587, 0.144] to get its luminance
        grey_img = np.clip(
            np.dot(img[..., :3], [0.299, 0.587, 0.144]), 0, (2**self.bit_depth)
        ).astype(np.uint16)
        return grey_img, np.average(grey_img, axis=(0, 1))

    def get_luminance_histogram_skewness(self, img):
        """
        Skewness Calculation in reference to:
        Zwillinger, D. and Kokoska, S. (2000). CRC Standard Probability and Statistics
        Tables and Formulae. Chapman & Hall: New York. 2000. Section 2.2.24.1
        """

        # First subtract central luminance to calculate skewness around it
        img = img.astype(np.float64) - self.center_illuminance

        # The sample skewness is computed as the Fisher-Pearson coefficient of
        # skewness, i.e. (m_3 / m_2**(3/2)) * g_1
        # where m_2 is 2nd moment (variance) and m_3 is third moment skewness

        img_size = img.size
        m_2 = np.sum(np.power(img, 2)) / img_size
        m_3 = np.sum(np.power(img, 3)) / img_size

        g_1 = np.sqrt(img_size * (img_size - 1)) / (img_size - 2)
        skewness = np.nan_to_num((m_3 / abs(m_2) ** (3 / 2)) * g_1)

        if self.is_debug:
            print("   - AE - Histogram Skewness = ", skewness)

        return skewness

    def execute(self):
        """
        Execute Auto Exposure
        """
        print("Auto Exposure= " + str(self.enable))

        if self.enable is False:
            return None
        else:
            start = time.time()
            ae_feedback = self.get_exposure_feedback()
            print(f"  Execution time: {time.time()-start:.3f}s")
            return ae_feedback

数学形式:

这里有两层重要混淆点:

  1. 虽然形式上套用了标准化偏度公式模板 ,但中心化基准C是固定 128,不是样本均值 。 👉 该变量skewness已经不是统计学教科书定义的 Fisher‑Pearson 样本偏度,只是借用标准化框架改造的自定义指标。
  2. 增加分母之后:消除了图像对比度对输出幅值的影响 。
    • 论文原版:同样曝光状态,对比度升高,会显著变大;
    • 代码改造后标准化指标:同样偏斜形态,对比度变化,输出 skewness 幅值基本不变。

关键要点备注

  1. 论文的三阶矩是原始三阶矩,没有除以方差做标准化;论文文字提到 skewness(偏斜现象),但数学模型没有统计学标准化偏度公式。
  2. 适用边界:仅验证单峰直方图场景;不讨论双峰、大面积高光饱和场景。
  3. 彩色图像处理策略:选取 RGB 通道中平均亮度最大的单通道计算指标,不是合成 Y 亮度。
  4. 判据:欠曝增加曝光时间;过曝减少曝光时间。
相关推荐
李游Leo1 小时前
HarmonyOS 7 + Hvigor-module.json5:权限增量审计与隐私声明一致性门禁【鸿蒙心迹】
数码相机·华为·harmonyos
高升说1 天前
深度相机接口选型:MIPI、USB3 与 GigE 的带宽估算与工程取舍
网络·人工智能·数码相机
高升说1 天前
户外强光下的深度相机:940nm 窄带与曝光策略
人工智能·数码相机
LabVIEW开发2 天前
LabVIEW 驱动 Andor 相机:从 SDK 到出图
数码相机·labview·labview知识·labview功能·labview程序
高升说2 天前
避障相机与激光雷达的硬件融合:时基、外参、算力与布局的工程实现
人工智能·数码相机
hahaha60163 天前
自动白平衡 & 手动白平衡
数码相机
钒星物联网3 天前
林区没信号,红外相机怎么把照片实时送出来?
数码相机·数据传输·卫星通信·红外相机·自组网·宽带卫星
特创数字科技3 天前
【uni-app x】告别系统相机限制!三端通用自定义相机组件:任意布局、静默拍照、录像、水印叠加、连拍回图一次搞定
前端·数码相机·uni-app
Jmyd01234 天前
手持激光三维扫描仪技术解析:三角测量数据链路、材质适配矩阵与点云处理流程
数码相机·矩阵·材质·三维数字化