4、自动对焦算法原理:对比度对焦(CDAF)、相位对焦(PDAF)、混合对焦(Hybrid AF)
自动对焦,说白了就是让镜头自己找到最清晰的那个位置。我做了这么多年影像调试,见过太多工程师把对焦算法当成黑盒子来调。其实搞懂它,你就能在调试时少走很多弯路。
这一章,我们重点拆解三种主流对焦方式:CDAF、PDAF 和 Hybrid AF。它们各有脾气,也各有绝活。
4.1 对比度对焦(CDAF)—— 稳扎稳打的爬山算法
CDAF 的原理其实很直观:图像越清晰,相邻像素的亮度差异就越大。说白了,就是找边缘最锐利的那张图。
我习惯把 CDAF 比作「爬山」。镜头从近到远移动,每到一个位置就计算一次图像的对比度值。对比度最高的点,就是山顶,也就是对焦最准的位置。
4.1.1 评价函数怎么选?
评价函数是 CDAF 的灵魂。我见过不少项目因为选错了评价函数,导致对焦反复震荡。常用的有几种:
| 评价函数 | 原理 | 特点 | 我踩过的坑 |
|---|---|---|---|
| Sobel 算子 | 水平/垂直边缘梯度求和 | 计算量适中,抗噪性一般 | 低光下容易误判 |
| Laplacian 算子 | 二阶微分,对边缘敏感 | 精度高,但对噪声敏感 | 纹理丰富的场景容易过冲 |
| Tenengrad 函数 | Sobel 梯度的平方和 | 单峰性好,稳定性高 | 计算量稍大 |
| 方差函数 | 像素灰度值的方差 | 简单快速,适合平坦区域 | 对焦峰值不够尖锐 |
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);
}
}
嗯,这里要注意:步长的衰减策略很关键。衰减太快容易陷入局部极值,衰减太慢又浪费时间。我个人习惯用「黄金分割法」来优化步长衰减,效果比二分法好不少。
4.2 相位对焦(PDAF)—— 一步到位的快枪手
PDAF 的原理和 CDAF 完全不同。它不靠「爬山」,而是靠相位差直接算出镜头该往哪走、走多少。
你想想看,PDAF 传感器上有一些特殊的像素,它们被分成左右(或上下)两个半区。当光线从不同方向进入时,左右半区接收到的图像会有偏移。这个偏移量,就是相位差。根据相位差,算法可以直接计算出对焦方向和步数。
4.2.1 PDAF 的优缺点
| 维度 | 优点 | 缺点 |
|---|---|---|
| 速度 | 一次计算到位,无需反复移动 | 受限于像素读出速度 |
| 低光性能 | 依赖相位检测像素,低光下精度下降 | 比 CDAF 更容易受噪声影响 |
| 硬件成本 | 无需额外传感器 | 需要专用像素,占用成像面积 |
| 场景适应性 | 运动场景表现优秀 | 纹理单一场景(如白墙)失效 |
4.3 混合对焦(Hybrid AF)—— 取长补短的王者
Hybrid AF 的思路很简单:用 PDAF 快速粗定位,再用 CDAF 精调。这样既保证了速度,又保证了精度。
我在项目中调试 Hybrid AF 时,最核心的工作就是切换策略。什么时候用 PDAF?什么时候切到 CDAF?切换的阈值怎么设?这些都是经验活。
4.3.1 典型的 Hybrid AF 流程
- 启动阶段:PDAF 快速计算相位差,驱动镜头到大致对焦位置。
- 精调阶段:切换到 CDAF,在小范围内做爬山搜索,找到精确峰值。
- 跟踪阶段:如果场景变化不大,保持 PDAF 跟踪;如果场景纹理丢失,切回 CDAF 重新搜索。
- 异常处理:如果 PDAF 置信度低(比如低光或纹理缺失),直接走 CDAF 全流程。
4.3.2 实战中的参数调优
Hybrid AF 的调试,说白了就是调几个关键参数。我列一个常用的参数表:
| 参数 | 作用 | 典型值 | 调试建议 |
|---|---|---|---|
| PDAF 粗搜步长 | 决定粗定位的速度 | 镜头行程的 10%~20% | 步长太大容易过冲,太小失去速度优势 |
| CDAF 精搜范围 | 精调时搜索的窗口大小 | 粗搜位置的 ±5% | 范围太小可能漏掉峰值 |
| PDAF 置信度阈值 | 切换依据 | 0.6 ~ 0.8 | 低光场景适当降低阈值 |
| CDAF 评价函数窗口 | 计算对比度的 ROI | 画面中心 30%~50% | 避免边缘区域干扰 |
4.4 三种方案的对比总结
最后,我用一张表把三种方案的核心差异列出来,方便你对照:
| 维度 | CDAF | PDAF | Hybrid AF |
|---|---|---|---|
| 对焦速度 | 慢(需要多次移动) | 快(一次计算) | 快(粗搜 + 精调) |
| 对焦精度 | 高(可达像素级) | 中等(受限于像素密度) | 高(PDAF 粗定位 + CDAF 精调) |
| 低光性能 | 好(依赖图像对比度) | 差(相位检测像素灵敏度下降) | 好(低光时切到 CDAF) |
| 纹理依赖 | 依赖纹理 | 依赖纹理 | 纹理缺失时走 CDAF |
| 硬件成本 | 低(无需专用像素) | 中(需要相位检测像素) | 中(同 PDAF) |
| 典型应用 | 工业相机、显微镜 | 单反、部分手机 | 主流手机、车载摄像头 |
说实话,这三种方案没有的优劣。我见过一些工业相机项目,至今还在用纯 CDAF,因为精度要求极高,速度反而不是瓶颈。但如果你做的是手机或车载摄像头,Hybrid AF 几乎是唯一的选择。