3. 爬山法基本原理:基于图像清晰度曲线的单峰搜索策略
在 ISP 自动对焦(AF)系统中,爬山法是最经典、应用最广泛的搜索策略。其核心假设是:图像清晰度评价函数(Focus Value, FV)在理想光学系统中呈现单峰曲线。爬山法通过比较相邻位置的清晰度值,判断“坡度”方向,从而驱动镜头向峰值位置移动。
3.1 单峰曲线假设与物理基础
爬山法的有效性依赖于图像清晰度曲线的单峰特性。该特性由光学系统的点扩散函数(PSF)决定:
- 合焦位置:PSF 最集中,高频分量最强,FV 达到最大值。
- 离焦位置:PSF 扩散,高频分量衰减,FV 单调下降。
- 理想条件:在无噪声、无遮挡、光照均匀的场景下,FV 曲线严格单峰。
工程提示: 实际场景中,由于传感器噪声、场景纹理分布不均、运动物体干扰,FV 曲线常出现局部抖动或伪峰。爬山法必须结合滞回比较、滤波窗口和防抖逻辑才能稳定工作。
3.2 爬山法核心流程
标准爬山法按以下步骤迭代执行,直到找到峰值:
- 初始化:设定起始位置
pos_0、步长step、方向标志dir(正向/反向)。 - 采样:在当前
pos_n采集一帧图像,计算 FV 值fv_n。 - 比较:将
fv_n与上一位置fv_{n-1}比较:- 若
fv_n > fv_{n-1}:继续沿当前方向移动一步。 - 若
fv_n < fv_{n-1}:判定越过峰值,反向并缩小步长。 - 若
fv_n ≈ fv_{n-1}:保持位置,进入微调模式。
- 若
- 终止条件:步长缩小到最小分辨率阈值,或连续多次 FV 变化小于设定门限。
- 输出:返回峰值对应的镜头位置。
关键参数表:
| 参数 | 典型值 | 影响 |
|---|---|---|
| 初始步长 | 10~20 DAC | 大步长加快粗搜,但易过冲 |
| 最小步长 | 1~2 DAC | 决定对焦精度 |
| FV 比较窗口 | 3~5 帧 | 平滑噪声,防止误判 |
| 峰值确认次数 | 2~3 次 | 避免伪峰误锁定 |
| 超时限制 | 500~2000 ms | 防止死循环 |
3.3 爬山法搜索过程 SVG 示意图
下图展示了爬山法在单峰 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 突变,误判峰值 | 增加时域滤波,或暂停搜索 |
| 多目标不同距离 | 出现多峰,陷入局部最优 | 使用多峰爬山法或全局扫描 |
| 微距/大光圈场景 | 景深极浅,峰值尖锐 | 缩小初始步长,提高采样率 |