光学与离焦
景深、点扩散函数、清晰度曲线——Z 轴焦点标定为什么是那样做的。
景深
物方景深(近似,几何光学):
DOF ≈ 2 · c · N · (1 + M) / M²
c 允许弥散圆直径(通常取 1~2 个像元,这里取 2 × 3.45 µm = 6.9 µm)
N 光圈数 f/#
M 放大倍率 = 像元尺寸 / 像素当量
demo-2axis-vision 上:M ≈ 3.45 µm / 19.82 µm ≈ 0.174,N = 4,
得 DOF ≈ 2 × 6.9 × 4 × 1.174 / 0.0303 ≈ 2.14 mm。
这个数字解释了为什么 Z 轴焦点标定的搜索范围默认是 ±3 mm: 比景深大一点,才能看到清晰度曲线的完整峰形。范围取太小,曲线是单调的,拟合不出峰。
点扩散函数
离焦量 Δz 对应的弥散圆直径:
d_blur = |Δz| · M / N (物方离焦换算到像方模糊)
虚拟相机用高斯 PSF 近似:σ = d_blur / (2·sqrt(2·ln2)),即把弥散圆当作高斯的半高全宽。
这是近似,不是衍射极限的严格解。够用的理由: 清晰度评价函数关心的是梯度能量随离焦的单调下降,高斯近似在这一点上与实测吻合得很好。 需要严格 PSF(比如做超分辨或相位恢复)时,这个模型不适用。
清晰度评价函数
Z 轴焦点标定要在一串 Z 位置上各抓一张图,算清晰度,找峰值。三种可选:
| 函数 | 公式 | 特点 |
|---|---|---|
| Tenengrad(默认) | Σ (Gx² + Gy²),Sobel 梯度 |
峰形尖锐,对噪声中等敏感 |
| 方差 | Σ (I − Ī)² |
计算最快,但对亮度变化敏感 |
| 拉普拉斯能量 | Σ (∇²I)² |
对高频最敏感,也最怕噪声 |
【坑】清晰度曲线的绝对值没有意义,只有峰的位置有意义。 换个曝光、换块标定板,曲线整体会抬高或压低,但峰位置不变。 见过有人拿清晰度绝对值做判据,结果换了光源之后全线失效。
峰值拟合
不要直接取最大值那个点——那样精度只能到采样步长。用峰附近三点做抛物线拟合:
设峰值点 i,值为 y₁ = S(z_{i-1}), y₂ = S(z_i), y₃ = S(z_{i+1})
δ = 0.5 · (y₁ − y₃) / (y₁ − 2y₂ + y₃)
z_focus = z_i + δ · Δz_step
步长 0.2 mm 时,这一步能把焦点定位精度从 ±100 µm 提到 ±10 µm 量级。
前提是曲线在峰附近确实接近抛物线。离焦太远的点拖进来拟合会让结果更差, 所以只取峰及其左右各一个点。
噪声对焦点的影响
清晰度是梯度平方和,而噪声本身有梯度,所以噪声会抬高整条曲线的基线, 在离焦较远处抬得比峰附近还明显(因为那里真实梯度小,噪声占比大)。
后果是:噪声大的时候,清晰度曲线会变平,峰不明显,拟合出来的焦点飘。
对策是先做几帧平均再算清晰度(虚拟设备里 avgFrames 参数可调),
或者把曝光调上去让信噪比变好。
实验 4 专门做这件事:把噪声调大,看焦点重复性从 ±8 µm 劣化到 ±60 µm, 再用帧平均把它救回来。