暗场与平场校正:从像素响应模型到噪声放大和失效掩膜


边缘发暗、像素响应不一致和暗偏置需要不同处理。本文从线性响应模型推导暗场和平场公式,以两像素算例说明为什么不能只做背景相减,并讨论参考帧噪声、近零分母、温漂以及独立平场验证方法。

背景看起来平了,不一定适合测量

同一块均匀样品,中心像素约 2000,边缘约 1500。直接减去一幅模糊背景,图像也许看起来均匀,但样品亮度加倍之后误差可能重新出现。问题在于背景变化既可能是加性偏置,也可能是乘性的照明和响应变化,二者不能用同一个减法解决。

本文讨论固定光路、固定通道、无饱和且近似线性的灰度采集。原始像素值以 DN 表示,自动增益、伽马、局部对比度和相机内部不明校正应先关闭或查清。已经经过非线性处理的图像,不能默认仍满足下文模型。

建立一个能区分加性与乘性的模型

令像素 i 的原始读数为 Ri,暗偏置为 Di,综合增益为 gi,待测信号为 Si:

1
Ri = Di + gi·Si + ni

这里 gi 可以包含像素响应、镜头渐晕与稳定照明的空间变化,ni 是随机噪声。用均匀参考输入 S0 获取平场 Fi,平均暗场为 D̂i,则 Fi−D̂i≈giS0。选择有效像素上的平均净平场 M,可定义校正结果:

1
Ci = (Ri−D̂i)·M / (Fi−D̂i)

该形式保留与平均响应一致的强度量级;若只需要相对透过率,也可不乘 M。相关公式可对照 BigStitcher 的平场说明。应先在报告中写清输出是校正后的 DN、相对强度还是有物理单位的辐照量,避免把归一化结果当绝对测量。

两个像素的可复算例子

设两个像素暗偏置均为 100,净响应分别为 1.0 和 0.8。对均匀 2000 单位参考光,平场读数为 2100、1700;对均匀 500 单位待测光,原始读数为 600、500。净平场均值 M=1800,校正后两者均为 450。

这个结果不是 500,因为采用平均响应作为标度。若要恢复输入物理量,还需要独立的绝对响应标定。只减暗场会得到 500、400,空间响应差仍然存在;不减暗场就直接除平场,两个像素的暗偏置占比不同,也无法严格消除误差。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
# Python 3,标准库;一维数组用于演示逐像素公式。
from math import isfinite

def correct(raw, dark, flat, min_net):
if not (len(raw) == len(dark) == len(flat)):
raise ValueError("参考帧与原图尺寸必须一致")
net = [f - d for f, d in zip(flat, dark)]
valid = [isfinite(v) and v > min_net for v in net]
values = [v for v, ok in zip(net, valid) if ok]
if not values:
raise ValueError("没有有效平场像素")
mean_net = sum(values) / len(values)
output = [
(r - d) * mean_net / v if ok else float("nan")
for r, d, v, ok in zip(raw, dark, net, valid)
]
return output, valid

out, mask = correct([600, 500], [100, 100], [2100, 1700], 50)
print(out, mask) # [450.0, 450.0] [True, True]

该代码不处理读取 TIFF、曝光匹配、饱和检测或坏点修补。工程实现应先将无符号整数转成浮点再相减,保留可能出现的负值,并将无效像素掩膜作为输出的一部分。

参考帧也有噪声,校正并非无代价

若平场中某处净信号只有中心的四分之一,校正增益约为 4,该处原始随机噪声也会被同比放大。校正消除的是稳定偏差,不能创造原来没有采集到的光子。

为看清参考误差,暂时忽略全局归一化 M 的不确定度,令 A=R−D、B=F−D,C=MA/B。一阶传播时有:

1
2
3
∂C/∂R = M/B
∂C/∂F = −MA/B²
∂C/∂D = M(R−F)/B²

如果 R、F、D 来自互相独立的采集,三项方差分别乘偏导平方后相加。暗场同一个估计同时出现在分子和分母,不能把两次暗场误差当成独立量重复相加;上面的第三个偏导已经合并了它的作用。

在只看平场噪声的近似下,其相对误差贡献约为 σF/B。若每帧平场净值 1000 DN、时间噪声标准差 20 DN,平均 100 帧且各帧独立时,参考均值标准差约 2 DN,相对误差约 0.2%。帧数增加只能压低随机项,光源漂移、固定污点和目标不均匀不会随平均自动消失。

如果两帧之间相关性明显,标准差按 1/√L 下降的假设会失效。可以比较不同帧数下参考均值的稳定性,并检查时间序列是否有周期闪烁或温漂。传感器非均匀性测量与时间噪声的区分可参见 EMVA 1288 Linear 4.0;本文的整机校正验证不等于完成标准规定的相机认证。

怎样选择分母阈值与无效区域

把 B 替换为 max(B,ε) 可以避免程序崩溃,却会给几乎无信号的像素制造很大的任意增益。更合理的方法是同时约束最低净平场与最大增益,例如要求 B>某个可用信噪比阈值,并要求 M/B 小于允许上限。

假设算法不能接受增益超过 3,那么 B<M/3 的区域应判为不可用,或者回到照明和镜头设计解决。阈值应由允许噪声、目标对比度和后续测量误差推导,不能把示例代码中的 50 DN 当通用经验值。

饱和像素同样不能参与参考。平场越亮,散粒噪声相对占比通常越小,但越接近非线性或饱和区,增益估计越容易偏差。应在相机已验证的线性区间内采集,而非追求“平场越白越好”。

负值、归一化与坏点需要明确语义

减暗场之后出现少量负值并不一定是错误。低信号附近的随机噪声会跨过零,如果立刻把所有负值裁成零,均值会产生向上的偏差,弱信号积分也会偏高。定量处理中通常先保留有符号浮点结果,把显示裁剪放到最后;只有业务规则明确要求时才执行数值截断。

归一化常数 M 也不是完全无误差的常量。它由整幅参考估计,误差会让全部像素一起缩放,属于相关的全局项。比较同图内两个区域的比值时,这个公共因子可能抵消;比较不同日期的绝对强度时,它却可能成为漂移来源。需要跨日期可比时,应增加稳定的外部参考,而不是每次让平场均值自动定义新标度。

坏点修补同样会改变测量对象。用于显示的邻域插值,可以掩盖一个坏点;用于小缺陷检测时,插值却可能抹掉真实目标。建议保留原始有效性掩膜,在测量区域与坏点相交时给出质量标记。参考帧文件还应记录采集日期和设备状态,换镜头、清洁光路、改变读出模式之后重新验证有效性。

把采集条件与验证分开设计

暗场需要相同曝光、增益、读出模式及接近的温度;长曝光下暗电流与短曝光偏置不能随意混用。平场还需要相同镜头、光圈、焦点、滤镜、通道、ROI 与像素合并模式。校正尘斑时,参考帧采集后光路中尘埃位置变化会留下反向残影。

均匀参考本身也是实验条件。用带纹理的纸张、显示器摩尔纹或不均匀荧光片获取平场,会把参考物的结构除进每张业务图像。采集建议可对照 UCSF 的平场参考图获取流程,但具体曝光与平均帧数仍需按自己的设备验证。

验收时另采一组没有参与构建参考的均匀场。比较校正前后的行列剖面、分区均值、空间变异系数与坏点掩膜,并在多个亮度档位重复。如果只在一个亮度档位变平,其他档位仍有残余斜率,可能是暗偏置不匹配、非线性或参考照明不稳定。

最后用真实任务检查定量结果:把同一特征移动到视场不同位置,比较面积、灰度积分或阈值稳定性。均匀场更平只是中间指标,任务误差是否下降才是校正是否有效的判断依据。


 上一篇
16 位图像为什么发黑:把采集动态范围、数值编码与显示映射分开 16 位图像为什么发黑:把采集动态范围、数值编码与显示映射分开
同一张十六位图在不同软件中亮度不同,通常不是文件损坏。本文区分传感器动态范围、有效位深和显示窗口,用可复算代码讨论固定窗口、百分位拉伸与伽马的作用,并说明跨图比较时应保留哪些参数。
2026-10-18
下一篇 
非序列杂散光分析:挡光环为什么越加越多,结果却未必可信 非序列杂散光分析:挡光环为什么越加越多,结果却未必可信
挡光结构的效果取决于它切断了哪条传播路径,也取决于仿真是否采到了稀有散射事件。本文从受照面与可见面交集建立分析流程,给出挡光口径和蒙特卡洛收敛算例,讨论材料、光线截断和视场渐晕的取舍。
2026-10-18
  目录