3. 对焦评价函数(下):Brenner函数、方差函数、FFT频域评价函数、自相关函数对比
上一章我们聊了灰度梯度类的评价函数,像Tenengrad、Laplacian这些。今天继续往下挖,把剩下的几类常用函数讲透。说实话,这部分内容在实际项目中踩坑最多,尤其是FFT和自相关,很多人用错了地方还不知道。
3.1 Brenner函数:最简单的梯度
Brenner函数,说白了就是只考虑水平方向相隔两个像素的梯度变化。公式很简单:
F = Σ|I(x+2, y) - I(x, y)|²
为什么是隔两个像素?我刚开始做算法时也纳闷。后来在调试一个低光照场景的对焦时才发现,隔一个像素噪声太大,隔三个又丢失细节。两个像素是个折中,既能抑制部分噪声,又能保留边缘信息。
我曾经在一个工业检测项目里吃过这个亏。检测对象是电路板上的焊点,焊点表面有大量水平方向的划痕纹理。用Brenner做评价函数,对焦曲线平得像条直线,根本找不到峰值。后来换成Tenengrad才解决问题。
3.2 方差函数:全局对比度
方差函数不关心具体边缘,它看的是整幅图像的灰度分散程度。公式:
F = Σ(I(x,y) - μ)²
其中μ是图像平均灰度。清晰图像像素值变化大,方差就大;模糊图像像素值趋近平均,方差就小。
嗯,这里要注意一点:方差函数对光照变化极其敏感。你想想看,如果场景亮度突然变了,方差值会跟着剧烈波动,但图像本身的清晰度可能根本没变。
| 函数 | 计算量 | 抗噪性 | 适用场景 |
|---|---|---|---|
| Brenner | 极低 | 中等 | 嵌入式、低功耗设备 |
| 方差 | 低 | 差 | 光照稳定的场景 |
| FFT | 高 | 好 | 高精度、离线分析 |
| 自相关 | 中等 | 好 | 纹理重复的场景 |
3.3 FFT频域评价函数
FFT评价函数的思路和前面完全不同。它把图像从空间域变换到频域,然后看高频分量有多少。清晰图像边缘锐利,高频分量丰富;模糊图像高频被衰减,能量集中在低频。
具体做法:
- 对图像做二维FFT变换
- 计算频谱的幅值或功率谱
- 提取高频区域的能量总和作为评价值
// 简化版FFT评价函数伪代码
F = 0
for each frequency (u, v):
if sqrt(u² + v²) > threshold:
F += |FFT(u, v)|²
说实话,FFT方法精度确实高,但计算量也大得吓人。我在手机摄像头项目里试过,一帧1080p图像做FFT,耗时接近50ms,根本跑不满30fps。后来只在实验室离线分析时才用。
3.4 自相关函数
自相关函数衡量的是图像与自身平移后的相似度。清晰图像的自相关函数在零点处有尖锐的峰值,而模糊图像的峰值会比较平缓。
公式:
F = Σ(I(x,y) * I(x+dx, y+dy))
实际应用中,我们通常计算自相关函数的半高宽(FWHM)或者峰值锐度来评价清晰度。
我记得有一次做显微成像的对焦,样本表面有大量重复的细胞结构。用梯度类函数效果很差,因为细胞边缘太相似了。换成自相关函数后,对焦曲线一下子就清晰了。自相关对重复纹理特别友好。
3.5 四种函数对比总结
下面这张SVG图把四种评价函数的核心逻辑和适用场景串起来了,方便你对照理解:
3.6 实际选型建议
说了这么多,到底怎么选?我个人的经验是:
- 嵌入式摄像头:首选Brenner,计算量小,够用就行
- 工业检测:用Tenengrad或Laplacian,精度和速度的平衡点
- 显微镜:自相关函数,对重复纹理效果好
- 实验室分析:FFT,精度最高,不差那点时间