physics
噪声模型
散粒噪声、读出噪声、暗电流、坏点——以及它们怎么影响标定精度。
三项噪声
虚拟相机的每个像元按下式加噪:
DN = DN_ideal + n_shot + n_read + n_dark
n_shot ~ Poisson(e_signal) 换算到 DN 与信号强度相关,亮处更大
n_read ~ N(0, σ_read²) 与信号无关,暗处占主导
n_dark ~ Poisson(i_dark · t_exp) 与曝光时间成正比
默认参数(对应一款常见的工业 CMOS):
| 参数 | 值 | 说明 |
|---|---|---|
| σ_read | 2.3 e⁻ | 读出噪声 |
| i_dark | 12 e⁻/s | 暗电流,室温 |
| e_full | 10500 e⁻ | 满阱容量 |
| QE | 0.62 @ 530 nm | 量子效率 |
| bits | 8 或 12 | 位深,可切 |
信噪比
SNR = e_signal / sqrt(e_signal + σ_read² + i_dark·t_exp)
信号足够强时 SNR ≈ sqrt(e_signal),即亮度翻倍,信噪比只涨 1.41 倍。
这解释了一个常被问到的问题:为什么把曝光拉满也没让精度变好多少。
噪声怎么影响标定
这才是这一节的重点。
圆心提取
圆心由边缘亚像素定位得到,噪声让每个边缘点的位置抖动 σ_edge。
一个有 N 个边缘点的圆,圆心误差约:
σ_center ≈ σ_edge / sqrt(N)
所以圆越大(边缘点越多),圆心越稳。这就是标定板圆点不宜太小的原因: 直径 10 px 的圆和 30 px 的圆,圆心精度差约 1.7 倍。
像素当量
像素当量由「多个圆心之间的距离」求解,圆心误差通过最小二乘平均掉一部分:
σ_scale / scale ≈ σ_center / (D · sqrt(M))
其中 D 是采集跨度(px),M 是采集点数。
两条实用结论:
- 采集跨度比采集点数更重要。走 50 mm 采 9 个点,比走 5 mm 采 50 个点准得多。
- 点数从 9 涨到 36,精度只提升 2 倍;跨度从 5 mm 涨到 50 mm,精度提升 10 倍。
新人几乎总是反着做——在视野中心密集采一堆点,然后奇怪为什么不准。
焦点标定
见光学与离焦。
坏点
按配置比例随机生成(默认 0.001%),分两类:
- 亮点:恒定输出高值;
- 死点:恒定输出 0。
坏点位置在一台虚拟机的生命周期内固定不变,和真相机一样。 这让「坏点补偿算法」可以被真正验证:补偿表做对了,换一次曝光坏点不会再冒出来。
怎么调
设备 → 虚拟设备 → 相机 → 噪声:
"noise": {
"enabled": true,
"readNoiseE": 2.3,
"darkCurrentEPerS": 12,
"fullWellE": 10500,
"qe": 0.62,
"badPixelRatio": 1e-5,
"seed": 20260921
}seed 固定住之后,噪声是可复现的——同样的输入得到同样的图。
这一点对写自动化测试很关键:断言「圆心误差 < 0.05 px」才有意义。
把 seed 设为 null 则每次随机,更接近真机的体验,适合教学。
最后更新: 2026/9/21
这页有帮助吗?