4. 清晰度评价函数:Tenengrad梯度函数、Laplacian算子、Brenner函数、方差函数、FFT频域分析法
在对比度法自动对焦(CAF)中,清晰度评价函数是决定对焦精度与速度的核心。不同的评价函数对图像纹理、噪声、光照的敏感度不同,直接影响搜索步长配置与合焦判断。本章详细解析五种常用评价函数的数学原理、实现方式及在RK平台上的适用场景。
4.1 评价函数概述与对比
清晰度评价函数本质上是一个从图像空间域或频域提取高频分量的映射算子。下表从计算复杂度、噪声鲁棒性、峰值尖锐度三个维度对比五种函数:
| 评价函数 | 计算复杂度 | 噪声鲁棒性 | 峰值尖锐度 | RK平台适用性 |
|---|---|---|---|---|
| Tenengrad梯度 | 中(3×3 Sobel) | 中 | 高 | 通用场景,推荐 |
| Laplacian算子 | 低(3×3核) | 低 | 中 | 纹理丰富场景 |
| Brenner函数 | 极低(差分) | 低 | 中 | 低算力平台 |
| 方差函数 | 低(均值+方差) | 高 | 低 | 光照稳定场景 |
| FFT频域分析 | 高(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); // 归一化
}
4.3 Laplacian算子
Laplacian算子是一个二阶微分算子,对图像边缘的响应比一阶梯度更强烈。标准3×3 Laplacian核为:
L = [[0, -1, 0], [-1, 4, -1], [0, -1, 0]]
评价函数值为所有像素Laplacian响应绝对值的和:
F(I) = Σ_x Σ_y | I * L |
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);
}
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 的频域环带)
- 出厂校准阶段,标定最佳合焦位置
- 实验室环境下的算法验证
- 评估其他评价函数的性能基准
4.7 评价函数选择决策流程
在RK平台AF调试中,评价函数的选择需综合考虑场景、算力、精度要求。以下决策流程可供参考:
- 判断场景类型:纹理丰富 → 优先Tenengrad;纹理稀疏 → 考虑方差+Laplacian组合
- 评估算力预算:CPU占用率 < 5% → Brenner;5%~15% → Tenengrad;>15% → 降采样后Tenengrad
- 噪声水平:高噪声 → 方差函数或FFT;低噪声 → Tenengrad或Laplacian
- 精度需求:普通拍照 → Tenengrad;高精度(如扫码) → FFT校准+Tenengrad跟踪
- 不要在全分辨率下计算评价函数,建议降采样到VGA(640×480)或更小
- 避免在图像边缘区域(边界10像素内)计算梯度,防止边界效应干扰
- 当场景包含强光源或高光反射时,评价函数值可能异常偏高,需做饱和度检测
4.8 本章小结
五种清晰度评价函数各有优劣:Tenengrad在精度与复杂度之间取得最佳平衡,是RK平台AF调试的首选;Brenner适合低功耗快速评估;Laplacian对边缘敏感但需噪声预处理;方差函数鲁棒但峰值平坦;FFT精度最高但计算代价大。实际调试中,建议以Tenengrad为主评价函数,其他函数作为辅助或特定场景下的替代方案。