3. 爬山法基本原理:基于图像清晰度曲线的单峰搜索策略

在 ISP 自动对焦(AF)系统中,爬山法是最经典、应用最广泛的搜索策略。其核心假设是:图像清晰度评价函数(Focus Value, FV)在理想光学系统中呈现单峰曲线。爬山法通过比较相邻位置的清晰度值,判断“坡度”方向,从而驱动镜头向峰值位置移动。

3.1 单峰曲线假设与物理基础

爬山法的有效性依赖于图像清晰度曲线的单峰特性。该特性由光学系统的点扩散函数(PSF)决定:

  • 合焦位置:PSF 最集中,高频分量最强,FV 达到最大值。
  • 离焦位置:PSF 扩散,高频分量衰减,FV 单调下降。
  • 理想条件:在无噪声、无遮挡、光照均匀的场景下,FV 曲线严格单峰。
工程提示: 实际场景中,由于传感器噪声、场景纹理分布不均、运动物体干扰,FV 曲线常出现局部抖动或伪峰。爬山法必须结合滞回比较、滤波窗口和防抖逻辑才能稳定工作。

3.2 爬山法核心流程

标准爬山法按以下步骤迭代执行,直到找到峰值:

  1. 初始化:设定起始位置 pos_0、步长 step、方向标志 dir(正向/反向)。
  2. 采样:在当前 pos_n 采集一帧图像,计算 FV 值 fv_n。
  3. 比较:将 fv_n 与上一位置 fv_{n-1} 比较:
    • 若 fv_n > fv_{n-1}:继续沿当前方向移动一步。
    • 若 fv_n < fv_{n-1}:判定越过峰值,反向并缩小步长。
    • 若 fv_n ≈ fv_{n-1}:保持位置,进入微调模式。
  4. 终止条件:步长缩小到最小分辨率阈值,或连续多次 FV 变化小于设定门限。
  5. 输出:返回峰值对应的镜头位置。
关键参数表:
参数 典型值 影响
初始步长 10~20 DAC 大步长加快粗搜,但易过冲
最小步长 1~2 DAC 决定对焦精度
FV 比较窗口 3~5 帧 平滑噪声,防止误判
峰值确认次数 2~3 次 避免伪峰误锁定
超时限制 500~2000 ms 防止死循环

3.3 爬山法搜索过程 SVG 示意图

下图展示了爬山法在单峰 FV 曲线上的搜索轨迹:镜头从起始位置出发,沿上升方向大步前进,越过峰值后反向并缩小步长,最终收敛到峰值附近。

爬山法搜索过程示意图 镜头位置 (pos) FV 值 峰值 起始 ① ② ③ ④ 过冲 ⑤ ⑥ 收敛 搜索阶段说明 ①→③:大步上升阶段 ④:检测到过冲,反向 ⑤:缩小步长,反向搜索 ⑥:步长最小,锁定峰值 上升方向 过冲/反向

3.4 爬山法 vs 全局扫描:策略对比

在 AF 搜索策略中,爬山法和全局扫描是两种极端方案。下表从多个维度对比两者的差异:

对比维度 爬山法 全局扫描
搜索原理 基于梯度方向,局部迭代 遍历全范围,记录最大值
搜索时间 快(通常 5~15 步) 慢(需扫描全部位置)
精度 依赖步长,可达亚像素级 受采样间隔限制
抗伪峰能力 弱(易陷入局部峰值) 强(全局比较)
适用场景 连续对焦、视频预览 初始化校准、场景切换
计算开销 低(每步 1 帧 FV) 高(全范围 FV 计算)

3.5 爬山法实现代码框架

以下 C 语言伪代码展示了爬山法的核心逻辑,包含方向判断、步长衰减和峰值确认:

/* 爬山法 AF 搜索核心函数 */
int hill_climbing_af(int start_pos, int init_step, int min_step) {
    int pos = start_pos;
    int step = init_step;
    int dir = 1;          // 1: 正向, -1: 反向
    int fv_prev = get_fv(pos);
    int fv_curr;
    int peak_count = 0;
    const int PEAK_CONFIRM = 3;  // 峰值确认次数

    while (step >= min_step) {
        // 沿当前方向移动一步
        pos += dir * step;
        fv_curr = get_fv(pos);

        if (fv_curr > fv_prev) {
            // 仍在上升,继续同方向
            fv_prev = fv_curr;
            peak_count = 0;  // 重置峰值计数
        } else if (fv_curr < fv_prev) {
            // 已过峰值,反向并缩小步长
            dir = -dir;
            step = step / 2;
            pos += dir * step;  // 回退到上一位置附近
            fv_prev = get_fv(pos);
            peak_count = 0;
        } else {
            // FV 不变,进入微调
            peak_count++;
            if (peak_count >= PEAK_CONFIRM) {
                break;  // 峰值确认
            }
        }

        // 边界保护
        if (pos < POS_MIN || pos > POS_MAX) {
            pos = clamp(pos, POS_MIN, POS_MAX);
            break;
        }
    }
    return pos;  // 返回合焦位置
}
工程陷阱: 上述代码未处理 FV 噪声抖动。实际部署时,必须在比较 fv_curr 和 fv_prev 之前加入滞回窗口(例如:abs(fv_curr - fv_prev) > NOISE_THRESHOLD),否则镜头会在平坦区域反复震荡。

3.6 爬山法的三大变体

针对不同场景,工业界演化出多种爬山法变体:

  • 自适应步长爬山法:根据 FV 变化率动态调整步长。变化率大时用大步,变化率小时自动切小步,兼顾速度与精度。
  • 滞回爬山法:引入滞回比较器,只有当 FV 下降超过设定门限时才判定过冲,避免噪声引起的误反向。
  • 多峰爬山法:在复杂场景下,先以大步长粗搜记录多个候选峰值,再对每个候选进行细搜,最后取全局最大值。

3.7 爬山法适用性总结

爬山法在 ISP AF 系统中占据核心地位,但并非万能。以下情况需谨慎使用:

场景 爬山法表现 建议策略
低纹理场景(白墙、天空) FV 曲线平坦,无法判断方向 结合激光测距或深度信息
高对比运动物体 FV 突变,误判峰值 增加时域滤波,或暂停搜索
多目标不同距离 出现多峰,陷入局部最优 使用多峰爬山法或全局扫描
微距/大光圈场景 景深极浅,峰值尖锐 缩小初始步长,提高采样率