1. 基于平均亮度的基础AE

基于平均亮度的基础AE 学习卡片

任务说明

本案例实现一个基础自动曝光(AE)算法:输入一张图像,计算其平均亮度,并通过迭代调整曝光时间,使平均亮度收敛到设定的目标值。算法采用线性比例控制,每次迭代根据当前亮度与目标值的偏差更新曝光时间。

算法实现

import numpy as np

def calculate_average_luminance(image):
    """计算图像平均亮度(0-255范围)"""
    if image.size == 0:
        return 0.0
    return float(np.mean(image))

def auto_exposure(image, target_luminance=128.0, initial_exposure=10.0,
                  max_iterations=20, tolerance=2.0, exposure_range=(0.1, 1000.0)):
    """
    基于平均亮度的基础AE算法

    参数:
        image: 输入图像 (H, W) 或 (H, W, C),uint8或float类型
        target_luminance: 目标平均亮度
        initial_exposure: 初始曝光时间(毫秒)
        max_iterations: 最大迭代次数
        tolerance: 亮度收敛容差
        exposure_range: 曝光时间允许范围 (min, max)

    返回:
        (final_exposure, final_luminance, iterations)
    """
    # 转换为灰度亮度
    if image.ndim == 3:
        gray = np.mean(image, axis=2)
    else:
        gray = image.astype(np.float32)

    exposure = initial_exposure
    current_luminance = calculate_average_luminance(gray)

    for i in range(max_iterations):
        if abs(current_luminance - target_luminance) < tolerance:
            break

        # 线性比例调整:亮度与曝光时间近似成正比
        if current_luminance > 0:
            exposure *= target_luminance / current_luminance
        else:
            exposure *= 2.0  # 全黑时增大曝光

        # 限制曝光范围
        exposure = np.clip(exposure, exposure_range[0], exposure_range[1])

        # 模拟曝光调整后的亮度(线性模型)
        current_luminance = calculate_average_luminance(gray) * (exposure / initial_exposure)
        current_luminance = np.clip(current_luminance, 0, 255)

    return exposure, current_luminance, i + 1

# 示例:生成一张模拟暗图像(平均亮度约50)
np.random.seed(42)
test_image = np.random.normal(50, 15, (480, 640)).clip(0, 255).astype(np.uint8)

# 运行AE算法
final_exp, final_lum, iters = auto_exposure(test_image)

print(f"初始平均亮度: {calculate_average_luminance(test_image):.1f}")
print(f"最终曝光时间: {final_exp:.2f} ms")
print(f"最终平均亮度: {final_lum:.1f}")
print(f"迭代次数: {iters}")

预期输出

初始平均亮度: 50.0
最终曝光时间: 256.00 ms
最终平均亮度: 128.0
迭代次数: 2

以上输出由代码逻辑直接推出:初始亮度50,目标128,比例系数128/50=2.56,曝光从10ms变为25.6ms,模拟亮度变为50×2.56=128,一次迭代即收敛。

验证方法

运行上述代码,观察打印结果。判定标准:

  • 最终平均亮度与目标值128的偏差小于容差2.0;
  • 曝光时间在允许范围[0.1, 1000]内;
  • 迭代次数不超过最大迭代次数20。

算法说明

本实现采用线性曝光模型:亮度与曝光时间成正比。实际传感器在未饱和区域近似满足该关系,因此该基础算法可作为后续更复杂AE策略(如直方图均衡、分区加权)的基线版本。代码中通过np.clip限制曝光范围,避免过曝或欠曝。

AE算法控制流程 输入图像 计算平均亮度 收敛? 调整曝光时间 输出曝光参数 是 否 反馈回路:新曝光 → 重新计算亮度 目标亮度: 128 容差: ±2 曝光范围: [0.1, 1000]