4、自动对焦算法原理:对比度对焦(CDAF)、相位对焦(PDAF)、混合对焦(Hybrid AF)

自动对焦,说白了就是让镜头自己找到最清晰的那个位置。我做了这么多年影像调试,见过太多工程师把对焦算法当成黑盒子来调。其实搞懂它,你就能在调试时少走很多弯路。

这一章,我们重点拆解三种主流对焦方式:CDAF、PDAF 和 Hybrid AF。它们各有脾气,也各有绝活。

核心观点:没有完美的对焦算法,只有最合适的场景。Hybrid AF 是目前手机和车载摄像头的主流方案,但理解它的前提是吃透 CDAF 和 PDAF。
自动对焦算法核心逻辑框架图 自动对焦算法核心逻辑框架 自动对焦(AF) CDAF(对比度对焦) PDAF(相位对焦) Hybrid AF(混合对焦) 爬山搜索算法 评价函数(Sobel/Laplacian) 相位检测像素 视差计算 → 一步到位 PDAF 粗定位 + CDAF 精调 场景自适应切换 CDAF 精度高但慢,PDAF 速度快但受光强影响,Hybrid AF 取长补短 —— 当前主流方案是 PDAF + CDAF 混合

4.1 对比度对焦(CDAF)—— 稳扎稳打的爬山算法

CDAF 的原理其实很直观:图像越清晰,相邻像素的亮度差异就越大。说白了,就是找边缘最锐利的那张图。

我习惯把 CDAF 比作「爬山」。镜头从近到远移动,每到一个位置就计算一次图像的对比度值。对比度最高的点,就是山顶,也就是对焦最准的位置。

4.1.1 评价函数怎么选?

评价函数是 CDAF 的灵魂。我见过不少项目因为选错了评价函数,导致对焦反复震荡。常用的有几种:

评价函数 原理 特点 我踩过的坑
Sobel 算子 水平/垂直边缘梯度求和 计算量适中,抗噪性一般 低光下容易误判
Laplacian 算子 二阶微分,对边缘敏感 精度高,但对噪声敏感 纹理丰富的场景容易过冲
Tenengrad 函数 Sobel 梯度的平方和 单峰性好,稳定性高 计算量稍大
方差函数 像素灰度值的方差 简单快速,适合平坦区域 对焦峰值不够尖锐
我的建议:实际项目中,我通常用 Tenengrad 作为主评价函数,配合方差函数做平坦区域的兜底。别迷信单一函数,场景不同,选择就不同。

4.1.2 爬山搜索策略

爬山算法听起来简单,但实现起来有不少细节。我举个例子:

// 伪代码:CDAF 爬山搜索
int current_pos = start_pos;
int current_value = evaluate(current_pos);
int step = large_step;  // 粗搜索步长

while (step > min_step) {
    int next_pos = current_pos + step;
    int next_value = evaluate(next_pos);
    
    if (next_value > current_value) {
        // 还在上升,继续走
        current_pos = next_pos;
        current_value = next_value;
    } else {
        // 过了峰值,回头并减小步长
        step = step / 2;
        current_pos = current_pos - step;
        current_value = evaluate(current_pos);
    }
}

嗯,这里要注意:步长的衰减策略很关键。衰减太快容易陷入局部极值,衰减太慢又浪费时间。我个人习惯用「黄金分割法」来优化步长衰减,效果比二分法好不少。

我曾经踩过的坑:有一次在低光场景下,CDAF 反复震荡,始终找不到峰值。后来发现是评价函数的噪声阈值设得太低,导致对比度曲线出现了多个假峰。解决办法是增加一个「死区」—— 只有当对比度变化超过一定阈值时,才认为是在爬山。

4.2 相位对焦(PDAF)—— 一步到位的快枪手

PDAF 的原理和 CDAF 完全不同。它不靠「爬山」,而是靠相位差直接算出镜头该往哪走、走多少。

你想想看,PDAF 传感器上有一些特殊的像素,它们被分成左右(或上下)两个半区。当光线从不同方向进入时,左右半区接收到的图像会有偏移。这个偏移量,就是相位差。根据相位差,算法可以直接计算出对焦方向和步数。

4.2.1 PDAF 的优缺点

维度 优点 缺点
速度 一次计算到位,无需反复移动 受限于像素读出速度
低光性能 依赖相位检测像素,低光下精度下降 比 CDAF 更容易受噪声影响
硬件成本 无需额外传感器 需要专用像素,占用成像面积
场景适应性 运动场景表现优秀 纹理单一场景(如白墙)失效
关键点:PDAF 不是万能的。当场景缺乏纹理(比如拍一面白墙),相位检测像素无法产生有效的相位差,这时候 PDAF 就会「失明」。所以,纯 PDAF 方案在手机摄像头上已经很少见了。

4.3 混合对焦(Hybrid AF)—— 取长补短的王者

Hybrid AF 的思路很简单:用 PDAF 快速粗定位,再用 CDAF 精调。这样既保证了速度,又保证了精度。

我在项目中调试 Hybrid AF 时,最核心的工作就是切换策略。什么时候用 PDAF?什么时候切到 CDAF?切换的阈值怎么设?这些都是经验活。

4.3.1 典型的 Hybrid AF 流程

  1. 启动阶段:PDAF 快速计算相位差,驱动镜头到大致对焦位置。
  2. 精调阶段:切换到 CDAF,在小范围内做爬山搜索,找到精确峰值。
  3. 跟踪阶段:如果场景变化不大,保持 PDAF 跟踪;如果场景纹理丢失,切回 CDAF 重新搜索。
  4. 异常处理:如果 PDAF 置信度低(比如低光或纹理缺失),直接走 CDAF 全流程。
我的经验:切换阈值不要设得太死。我习惯用「PDAF 置信度」作为切换依据。置信度高于 0.8,就用 PDAF 粗定位 + CDAF 精调;低于 0.5,直接走 CDAF。中间区域做平滑过渡,避免来回切换导致画面抖动。

4.3.2 实战中的参数调优

Hybrid AF 的调试,说白了就是调几个关键参数。我列一个常用的参数表:

参数 作用 典型值 调试建议
PDAF 粗搜步长 决定粗定位的速度 镜头行程的 10%~20% 步长太大容易过冲,太小失去速度优势
CDAF 精搜范围 精调时搜索的窗口大小 粗搜位置的 ±5% 范围太小可能漏掉峰值
PDAF 置信度阈值 切换依据 0.6 ~ 0.8 低光场景适当降低阈值
CDAF 评价函数窗口 计算对比度的 ROI 画面中心 30%~50% 避免边缘区域干扰
我曾经踩过的坑:有一次在运动场景下,Hybrid AF 频繁在 PDAF 和 CDAF 之间切换,导致画面忽明忽暗。后来发现是 PDAF 置信度阈值设得太敏感,稍微有点运动就触发切换。解决办法是增加一个「切换滞回区」—— 从 PDAF 切到 CDAF 的阈值和从 CDAF 切回 PDAF 的阈值不同,留一个缓冲带。

4.4 三种方案的对比总结

最后,我用一张表把三种方案的核心差异列出来,方便你对照:

维度 CDAF PDAF Hybrid AF
对焦速度 慢(需要多次移动) 快(一次计算) 快(粗搜 + 精调)
对焦精度 高(可达像素级) 中等(受限于像素密度) 高(PDAF 粗定位 + CDAF 精调)
低光性能 好(依赖图像对比度) 差(相位检测像素灵敏度下降) 好(低光时切到 CDAF)
纹理依赖 依赖纹理 依赖纹理 纹理缺失时走 CDAF
硬件成本 低(无需专用像素) 中(需要相位检测像素) 中(同 PDAF)
典型应用 工业相机、显微镜 单反、部分手机 主流手机、车载摄像头

说实话,这三种方案没有的优劣。我见过一些工业相机项目,至今还在用纯 CDAF,因为精度要求极高,速度反而不是瓶颈。但如果你做的是手机或车载摄像头,Hybrid AF 几乎是唯一的选择。