2、对焦评价函数:清晰度评价函数(如 Tenengrad、Laplacian、Brenner)的原理与对比

在自动对焦(AF)系统中,对焦评价函数是判断图像清晰度的核心算法。其本质是通过计算图像高频分量的能量或梯度强度,来量化图像的锐利程度。本节将深入剖析三种经典清晰度评价函数——Tenengrad、Laplacian 和 Brenner 的数学原理、实现差异及适用场景。

2.1 清晰度评价的数学基础

图像清晰度与高频信息含量正相关。对焦准确的图像边缘锐利、细节丰富,在频域上表现为高频分量能量集中;离焦图像则因低通滤波效应导致高频衰减。评价函数通过空间域或频域算子提取高频成分,输出一个标量值作为清晰度指标。

核心原则: 理想的对焦评价函数应具备单峰性、无偏性、灵敏度高、计算量低等特性,以适应实时 ISP 处理。

2.2 三种经典评价函数原理

2.2.1 Tenengrad 函数

Tenengrad 基于 Sobel 算子计算图像梯度。Sobel 算子通过两个 3×3 卷积核分别检测水平(Gx)和垂直(Gy)方向的边缘,然后计算每个像素的梯度幅值,最后对所有像素的幅值求和或求平均作为清晰度得分。

// Tenengrad 核心计算(C 风格伪码)
float tenengrad_score(uint8_t* img, int w, int h) {
    float sum = 0.0f;
    int sobel_x[3][3] = {{-1, 0, 1}, {-2, 0, 2}, {-1, 0, 1}};
    int sobel_y[3][3] = {{-1, -2, -1}, {0, 0, 0}, {1, 2, 1}};
    for (int y = 1; y < h-1; y++) {
        for (int x = 1; x < w-1; x++) {
            int gx = 0, gy = 0;
            for (int ky = -1; ky <= 1; ky++)
                for (int kx = -1; kx <= 1; kx++) {
                    int pixel = img[(y+ky)*w + (x+kx)];
                    gx += pixel * sobel_x[ky+1][kx+1];
                    gy += pixel * sobel_y[ky+1][kx+1];
                }
            sum += sqrtf(gx*gx + gy*gy);  // 梯度幅值
        }
    }
    return sum / ((w-2)*(h-2));  // 归一化
}

特点: 对水平和垂直边缘敏感,抗噪性较好,但计算量较大(涉及平方根运算)。

2.2.2 Laplacian 函数

Laplacian 算子使用二阶微分检测图像中的快速灰度变化。标准 3×3 Laplacian 核为:

// Laplacian 核(中心为正)
int laplacian_kernel[3][3] = {{0, -1, 0}, {-1, 4, -1}, {0, -1, 0}};

计算时对每个像素应用该核,取绝对值或平方后求和。由于二阶微分对噪声敏感,Laplacian 函数在低噪声场景下灵敏度极高,但在噪声环境中容易产生虚假峰值。

// Laplacian 清晰度计算
float laplacian_score(uint8_t* img, int w, int h) {
    float sum = 0.0f;
    for (int y = 1; y < h-1; y++) {
        for (int x = 1; x < w-1; x++) {
            int lap = 4*img[y*w + x]
                    - img[(y-1)*w + x] - img[(y+1)*w + x]
                    - img[y*w + (x-1)] - img[y*w + (x+1)];
            sum += fabsf(lap);  // 取绝对值
        }
    }
    return sum / ((w-2)*(h-2));
}

2.2.3 Brenner 函数

Brenner 函数是最简单的梯度评价方法之一,仅计算水平方向相隔两个像素的灰度差平方。其计算量极低,适合硬件实现。

// Brenner 函数(水平方向)
float brenner_score(uint8_t* img, int w, int h) {
    float sum = 0.0f;
    for (int y = 0; y < h; y++) {
        for (int x = 0; x < w-2; x++) {
            int diff = img[y*w + x] - img[y*w + x + 2];
            sum += diff * diff;  // 差平方
        }
    }
    return sum / (w * h);
}

特点: 计算量最小,但仅利用水平方向信息,对垂直纹理不敏感,且易受噪声影响。

2.3 三种函数对比分析

评价维度 Tenengrad Laplacian Brenner
数学基础 一阶梯度(Sobel) 二阶微分 一阶差分(隔点)
方向敏感性 水平+垂直 各向同性 仅水平
计算复杂度 高(含平方根) 中(无平方根) 低(仅减法+乘法)
抗噪性 较好 较差 差
灵敏度 中 高 低
单峰性 优 良(噪声下易多峰) 中
硬件实现 需乘法器+开方单元 需乘法器 加法器即可
典型应用 通用相机、监控 显微、精密对焦 低成本嵌入式、快速粗调
选型建议: 在 ISP 流水线中,若计算资源充足且对精度要求高,优先选择 Tenengrad;若追求极低延迟(如 4K 视频实时对焦),Brenner 配合降噪预处理是可行方案;Laplacian 适合在受控光照环境下使用。

2.4 评价函数响应曲线对比

下图展示了三种函数在理想对焦过程中的归一化响应曲线。横轴为镜头位置(从离焦到对焦再到离焦),纵轴为清晰度得分。

三种清晰度评价函数响应曲线对比 镜头位置(离焦 → 对焦 → 离焦) 清晰度得分 Tenengrad Laplacian Brenner 最佳对焦位置 注:Laplacian 峰值最尖锐但易受噪声干扰;Tenengrad 曲线平滑且单峰性好;Brenner 峰值较平缓,适合粗调。

2.5 评价函数选择策略

在实际 ISP 系统中,评价函数的选择需综合考虑以下因素:

  • 场景光照: 低光照下噪声放大,应优先选择抗噪性强的 Tenengrad 或对图像进行预处理降噪。
  • 计算预算: 移动端 ISP 通常有严格的功耗和延迟限制,Brenner 或简化版 Laplacian 更合适。
  • 对焦精度: 高精度应用(如显微镜、工业检测)需 Laplacian 或 Tenengrad 的尖锐峰值。
  • 纹理方向: 若场景以水平纹理为主(如条形码),Brenner 可能失效,需改用各向同性算子。
常见陷阱: 不要直接使用原始图像计算评价函数。建议先进行 Gamma 校正 或 直方图均衡化,以消除光照不均匀对梯度幅值的影响。此外,ROI(感兴趣区域)的选择应避开天空、白墙等平坦区域,否则评价函数将失去区分度。

2.6 评价函数的硬件加速架构

下图展示了一种典型的 ISP 硬件加速架构,用于实时计算 Tenengrad 清晰度得分。该架构采用流水线设计,可在单时钟周期内完成一个像素的梯度计算。

Tenengrad 硬件加速架构(流水线) Line Buffer Sobel 卷积 幅值计算 累加器 3 行图像数据 Gx, Gy 输出 sqrt(Gx²+Gy²) 累加求和 控制单元(时钟同步、流水线控制、帧结束信号) 清晰度得分

2.7 小结

Tenengrad、Laplacian 和 Brenner 分别代表了清晰度评价函数在精度、灵敏度和计算效率三个维度的不同权衡。在 ISP 自动对焦系统中,通常采用 多级评价策略:粗调阶段使用 Brenner 快速定位大致对焦范围,精调阶段切换至 Tenengrad 或 Laplacian 进行精确峰值搜索。理解这些函数的原理与特性,是后续设计爬山法搜索策略和全局扫描算法的基础。