2、对焦评价函数:清晰度评价函数(如 Tenengrad、Laplacian、Brenner)的原理与对比
在自动对焦(AF)系统中,对焦评价函数是判断图像清晰度的核心算法。其本质是通过计算图像高频分量的能量或梯度强度,来量化图像的锐利程度。本节将深入剖析三种经典清晰度评价函数——Tenengrad、Laplacian 和 Brenner 的数学原理、实现差异及适用场景。
2.1 清晰度评价的数学基础
图像清晰度与高频信息含量正相关。对焦准确的图像边缘锐利、细节丰富,在频域上表现为高频分量能量集中;离焦图像则因低通滤波效应导致高频衰减。评价函数通过空间域或频域算子提取高频成分,输出一个标量值作为清晰度指标。
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) | 二阶微分 | 一阶差分(隔点) |
| 方向敏感性 | 水平+垂直 | 各向同性 | 仅水平 |
| 计算复杂度 | 高(含平方根) | 中(无平方根) | 低(仅减法+乘法) |
| 抗噪性 | 较好 | 较差 | 差 |
| 灵敏度 | 中 | 高 | 低 |
| 单峰性 | 优 | 良(噪声下易多峰) | 中 |
| 硬件实现 | 需乘法器+开方单元 | 需乘法器 | 加法器即可 |
| 典型应用 | 通用相机、监控 | 显微、精密对焦 | 低成本嵌入式、快速粗调 |
2.4 评价函数响应曲线对比
下图展示了三种函数在理想对焦过程中的归一化响应曲线。横轴为镜头位置(从离焦到对焦再到离焦),纵轴为清晰度得分。
2.5 评价函数选择策略
在实际 ISP 系统中,评价函数的选择需综合考虑以下因素:
- 场景光照: 低光照下噪声放大,应优先选择抗噪性强的 Tenengrad 或对图像进行预处理降噪。
- 计算预算: 移动端 ISP 通常有严格的功耗和延迟限制,Brenner 或简化版 Laplacian 更合适。
- 对焦精度: 高精度应用(如显微镜、工业检测)需 Laplacian 或 Tenengrad 的尖锐峰值。
- 纹理方向: 若场景以水平纹理为主(如条形码),Brenner 可能失效,需改用各向同性算子。
2.6 评价函数的硬件加速架构
下图展示了一种典型的 ISP 硬件加速架构,用于实时计算 Tenengrad 清晰度得分。该架构采用流水线设计,可在单时钟周期内完成一个像素的梯度计算。
2.7 小结
Tenengrad、Laplacian 和 Brenner 分别代表了清晰度评价函数在精度、灵敏度和计算效率三个维度的不同权衡。在 ISP 自动对焦系统中,通常采用 多级评价策略:粗调阶段使用 Brenner 快速定位大致对焦范围,精调阶段切换至 Tenengrad 或 Laplacian 进行精确峰值搜索。理解这些函数的原理与特性,是后续设计爬山法搜索策略和全局扫描算法的基础。