3. 对焦评价函数(下):Brenner函数、方差函数、FFT频域评价函数、自相关函数对比

上一章我们聊了灰度梯度类的评价函数,像Tenengrad、Laplacian这些。今天继续往下挖,把剩下的几类常用函数讲透。说实话,这部分内容在实际项目中踩坑最多,尤其是FFT和自相关,很多人用错了地方还不知道。

3.1 Brenner函数:最简单的梯度

Brenner函数,说白了就是只考虑水平方向相隔两个像素的梯度变化。公式很简单:

F = Σ|I(x+2, y) - I(x, y)|²

为什么是隔两个像素?我刚开始做算法时也纳闷。后来在调试一个低光照场景的对焦时才发现,隔一个像素噪声太大,隔三个又丢失细节。两个像素是个折中,既能抑制部分噪声,又能保留边缘信息。

我的经验: Brenner函数计算量极小,适合用在资源受限的嵌入式平台。但它的缺点也很明显——只考虑水平方向,对垂直纹理不敏感。如果你拍的物体主要是横条纹,那Brenner基本就废了。

我曾经在一个工业检测项目里吃过这个亏。检测对象是电路板上的焊点,焊点表面有大量水平方向的划痕纹理。用Brenner做评价函数,对焦曲线平得像条直线,根本找不到峰值。后来换成Tenengrad才解决问题。

3.2 方差函数:全局对比度

方差函数不关心具体边缘,它看的是整幅图像的灰度分散程度。公式:

F = Σ(I(x,y) - μ)²

其中μ是图像平均灰度。清晰图像像素值变化大,方差就大;模糊图像像素值趋近平均,方差就小。

嗯,这里要注意一点:方差函数对光照变化极其敏感。你想想看,如果场景亮度突然变了,方差值会跟着剧烈波动,但图像本身的清晰度可能根本没变。

函数 计算量 抗噪性 适用场景
Brenner 极低 中等 嵌入式、低功耗设备
方差 低 差 光照稳定的场景
FFT 高 好 高精度、离线分析
自相关 中等 好 纹理重复的场景
避坑指南: 我曾经在户外监控项目里直接用方差函数做对焦评价。白天还好,一到傍晚光线变化,对焦曲线就开始乱跳。后来加了光照补偿才勉强能用。所以,光照不稳定的场景,慎用方差。

3.3 FFT频域评价函数

FFT评价函数的思路和前面完全不同。它把图像从空间域变换到频域,然后看高频分量有多少。清晰图像边缘锐利,高频分量丰富;模糊图像高频被衰减,能量集中在低频。

具体做法:

  1. 对图像做二维FFT变换
  2. 计算频谱的幅值或功率谱
  3. 提取高频区域的能量总和作为评价值
// 简化版FFT评价函数伪代码
F = 0
for each frequency (u, v):
    if sqrt(u² + v²) > threshold:
        F += |FFT(u, v)|²

说实话,FFT方法精度确实高,但计算量也大得吓人。我在手机摄像头项目里试过,一帧1080p图像做FFT,耗时接近50ms,根本跑不满30fps。后来只在实验室离线分析时才用。

关键点: FFT评价函数的阈值选择很重要。阈值设得太低,会把低频噪声也算进去;设得太高,又会丢失细节信息。我一般建议用频谱能量的累积分布曲线来找拐点,那个位置通常是最优阈值。

3.4 自相关函数

自相关函数衡量的是图像与自身平移后的相似度。清晰图像的自相关函数在零点处有尖锐的峰值,而模糊图像的峰值会比较平缓。

公式:

F = Σ(I(x,y) * I(x+dx, y+dy))

实际应用中,我们通常计算自相关函数的半高宽(FWHM)或者峰值锐度来评价清晰度。

我记得有一次做显微成像的对焦,样本表面有大量重复的细胞结构。用梯度类函数效果很差,因为细胞边缘太相似了。换成自相关函数后,对焦曲线一下子就清晰了。自相关对重复纹理特别友好。

我的建议: 自相关函数适合纹理重复性高的场景,比如织物、细胞、晶圆等。但如果是自然风景或者人脸这种随机纹理,自相关的效果反而不如梯度类函数。

3.5 四种函数对比总结

下面这张SVG图把四种评价函数的核心逻辑和适用场景串起来了,方便你对照理解:

对焦评价函数对比(下) Brenner函数 隔像素差分 计算量极低 方差函数 全局对比度 对光照敏感 FFT频域函数 高频能量分析 精度高、计算大 自相关函数 重复纹理友好 峰值锐度评价 适用场景速查 Brenner→嵌入式 | 方差→光照稳定 | FFT→离线高精度 | 自相关→重复纹理 计算量排序 Brenner < 方差 < 自相关 < FFT (低 → 高) 抗噪性排序 方差 < Brenner < 自相关 < FFT (差 → 好) 精度排序 Brenner < 方差 < 自相关 < FFT (低 → 高) 选型建议 资源受限→Brenner | 光照稳定→方差 | 精度优先→FFT | 重复纹理→自相关 实际项目中常组合使用,比如Brenner粗搜 + FFT精搜

3.6 实际选型建议

说了这么多,到底怎么选?我个人的经验是:

  • 嵌入式摄像头:首选Brenner,计算量小,够用就行
  • 工业检测:用Tenengrad或Laplacian,精度和速度的平衡点
  • 显微镜:自相关函数,对重复纹理效果好
  • 实验室分析:FFT,精度最高,不差那点时间
重要提醒: 不要迷信单一评价函数。我做过一个项目,白天用Brenner效果很好,晚上噪声大了就完全不行。后来改成白天用Brenner,晚上自动切换到方差函数(配合降噪预处理),才把问题解决。灵活组合才是王道。