4. 清晰度评价函数:Tenengrad梯度函数、Laplacian算子、Brenner函数、方差函数、FFT频域分析法

在对比度法自动对焦(CAF)中,清晰度评价函数是决定对焦精度与速度的核心。不同的评价函数对图像纹理、噪声、光照的敏感度不同,直接影响搜索步长配置与合焦判断。本章详细解析五种常用评价函数的数学原理、实现方式及在RK平台上的适用场景。

4.1 评价函数概述与对比

清晰度评价函数本质上是一个从图像空间域或频域提取高频分量的映射算子。下表从计算复杂度、噪声鲁棒性、峰值尖锐度三个维度对比五种函数:

评价函数 计算复杂度 噪声鲁棒性 峰值尖锐度 RK平台适用性
Tenengrad梯度 中(3×3 Sobel) 中 高 通用场景,推荐
Laplacian算子 低(3×3核) 低 中 纹理丰富场景
Brenner函数 极低(差分) 低 中 低算力平台
方差函数 低(均值+方差) 高 低 光照稳定场景
FFT频域分析 高(FFT变换) 高 极高 高精度校准
选型建议:在RK平台ISP Pipeline中,推荐以Tenengrad作为主评价函数,Brenner作为低功耗预览模式下的快速评估函数,FFT仅用于出厂校准或实验室标定。

4.2 Tenengrad梯度函数

Tenengrad函数基于Sobel算子计算图像水平和垂直方向的梯度幅值,是目前对比度法中最常用的评价函数之一。其数学表达式为:

F(I) = Σ_x Σ_y [ G_x(x,y)² + G_y(x,y)² ]

其中:
G_x = I * S_x,  G_y = I * S_y
S_x = [[-1, 0, 1], [-2, 0, 2], [-1, 0, 1]]
S_y = [[-1, -2, -1], [0, 0, 0], [1, 2, 1]]

在RK平台实现时,通常对图像进行降采样(如VGA分辨率)后再计算,以平衡精度与帧率。以下为C语言参考实现:

// Tenengrad 清晰度评价(灰度图输入)
float tenengrad_sharpness(uint8_t *img, int width, int height) {
    int gx, gy;
    float sum = 0.0f;
    for (int y = 1; y < height - 1; y++) {
        for (int x = 1; x < width - 1; x++) {
            gx = -img[(y-1)*width + (x-1)] + img[(y-1)*width + (x+1)]
                 -2*img[y*width + (x-1)] + 2*img[y*width + (x+1)]
                 -img[(y+1)*width + (x-1)] + img[(y+1)*width + (x+1)];
            gy = -img[(y-1)*width + (x-1)] -2*img[(y-1)*width + x] - img[(y-1)*width + (x+1)]
                 + img[(y+1)*width + (x-1)] + 2*img[(y+1)*width + x] + img[(y+1)*width + (x+1)];
            sum += (float)(gx*gx + gy*gy);
        }
    }
    return sum / (width * height);  // 归一化
}
调试要点:Tenengrad对图像噪声敏感,建议在计算前先做3×3中值滤波。在RK3588等平台,可利用RGA硬件加速Sobel运算,将计算耗时从毫秒级降至微秒级。
Tenengrad 梯度计算流程 输入灰度图像 Sobel X 卷积 Sobel Y 卷积 Gx² + Gy² 逐像素累加 归一化 清晰度值 说明:Sobel核大小为3×3,支持分离式加速(先水平后垂直),在RK平台可复用ISP硬件卷积单元。 归一化因子为图像像素总数,用于消除分辨率差异对评价值的影响。

4.3 Laplacian算子

Laplacian算子是一个二阶微分算子,对图像边缘的响应比一阶梯度更强烈。标准3×3 Laplacian核为:

L = [[0, -1, 0], [-1, 4, -1], [0, -1, 0]]

评价函数值为所有像素Laplacian响应绝对值的和:

F(I) = Σ_x Σ_y | I * L |
注意事项:Laplacian算子对噪声极度敏感,单个噪点可能导致评价值剧烈跳变。在RK平台使用时,务必先做高斯滤波(σ=1.0~1.5)预处理。此外,Laplacian响应在平坦区域趋近于零,不适合纯色背景场景。

4.4 Brenner函数

Brenner函数是最简单的梯度评价函数之一,仅计算水平方向相隔两个像素的灰度差平方:

F(I) = Σ_x Σ_y [ I(x+2, y) - I(x, y) ]²

其优势在于计算量极低,适合在RK平台低功耗模式或高帧率预览场景下使用。但缺点也很明显:仅考虑水平方向,对垂直纹理不敏感。

// Brenner 清晰度评价(仅水平方向)
float brenner_sharpness(uint8_t *img, int width, int height) {
    float sum = 0.0f;
    for (int y = 0; y < height; y++) {
        for (int x = 0; x < width - 2; x++) {
            int diff = img[y*width + x + 2] - img[y*width + x];
            sum += (float)(diff * diff);
        }
    }
    return sum / (width * height);
}
优化技巧:在RK平台,可将Brenner函数与Tenengrad组合使用:先用Brenner快速粗搜索定位大致合焦范围,再用Tenengrad进行精细搜索,兼顾速度与精度。

4.5 方差函数

方差函数基于图像灰度分布的离散程度来评价清晰度。图像越清晰,像素灰度值偏离均值越大,方差越高:

F(I) = (1/N) Σ_x Σ_y [ I(x,y) - μ ]²

其中 μ = (1/N) Σ_x Σ_y I(x,y)

方差函数对光照变化不敏感,但峰值平坦,不适合高精度对焦。在RK平台中,方差函数常用于检测场景切换或作为辅助评价指标。

场景类型 方差值范围 对焦区分度 推荐用途
均匀光照、纹理丰富 2000~8000 中 辅助判断
低光照、纹理稀疏 100~500 低 不推荐单独使用
高对比度边缘场景 5000~15000 高 可作主评价

4.6 FFT频域分析法

FFT频域分析法将图像变换到频率域,通过分析高频分量能量来评价清晰度。清晰图像的高频分量丰富,模糊图像的高频分量衰减严重。

评价函数定义为高频能量与总能量的比值:

F(I) = Σ_{u,v ∈ HF} |F(u,v)|² / Σ_{u,v} |F(u,v)|²

其中 HF 为高频区域(如半径 > 图像尺寸/4 的频域环带)
RK平台实现注意:FFT计算量大,不建议在实时对焦循环中使用。通常用于:
  • 出厂校准阶段,标定最佳合焦位置
  • 实验室环境下的算法验证
  • 评估其他评价函数的性能基准
在RK3588等带NPU的平台,可尝试用FFT加速库(如FFTW或CMSIS-DSP)优化计算效率。
FFT频域清晰度评价原理 清晰图像 高频分量丰富 边缘锐利 FFT变换 频域能量分布 高频区(外环) 高频能量 / 总能量 比值 → 清晰度 说明:FFT频域分析法将图像从空间域变换到频率域。清晰图像的高频分量(外环区域)能量占比高, 模糊图像的高频分量衰减严重。高频阈值通常设为图像尺寸的1/4,即半径 > min(W,H)/8 的区域。

4.7 评价函数选择决策流程

在RK平台AF调试中,评价函数的选择需综合考虑场景、算力、精度要求。以下决策流程可供参考:

  1. 判断场景类型:纹理丰富 → 优先Tenengrad;纹理稀疏 → 考虑方差+Laplacian组合
  2. 评估算力预算:CPU占用率 < 5% → Brenner;5%~15% → Tenengrad;>15% → 降采样后Tenengrad
  3. 噪声水平:高噪声 → 方差函数或FFT;低噪声 → Tenengrad或Laplacian
  4. 精度需求:普通拍照 → Tenengrad;高精度(如扫码) → FFT校准+Tenengrad跟踪
常见陷阱:
  • 不要在全分辨率下计算评价函数,建议降采样到VGA(640×480)或更小
  • 避免在图像边缘区域(边界10像素内)计算梯度,防止边界效应干扰
  • 当场景包含强光源或高光反射时,评价函数值可能异常偏高,需做饱和度检测

4.8 本章小结

五种清晰度评价函数各有优劣:Tenengrad在精度与复杂度之间取得最佳平衡,是RK平台AF调试的首选;Brenner适合低功耗快速评估;Laplacian对边缘敏感但需噪声预处理;方差函数鲁棒但峰值平坦;FFT精度最高但计算代价大。实际调试中,建议以Tenengrad为主评价函数,其他函数作为辅助或特定场景下的替代方案。