2、BLC校准原理:光学暗区与哑像素的区别、BLC校准目标值(目标码值)、BLC校准的数学公式

各位同学,今天我们来聊聊BLC校准里最核心的几个概念。说实话,很多工程师做了好几年调试,对这几个基础概念还是模模糊糊的。我当年刚入行时也踩过坑,所以今天咱们把这块彻底讲透。

2.1 光学暗区 vs 哑像素:别搞混了

先问大家一个问题:传感器全黑时,输出值应该是0吗?

答案是否定的。实际上,即使你把镜头盖得严严实实,传感器依然会输出一个非零的数值。这个数值的来源,就是我们今天要讲的两个关键概念。

2.1.1 光学暗区(Optical Black)

光学暗区,说白了就是传感器上那些被物理遮挡的像素。你去看看CMOS传感器的结构图,会发现边缘有一排排被金属层盖住的像素,光根本照不进去。这些像素就是光学暗区。

它们的作用是什么?实时监测暗电流。因为和有效像素在同一颗芯片上,工艺、温度完全一致,所以它们的输出值能真实反映当前条件下的暗电流水平。

关键点:光学暗区是硬件设计的产物,不是软件模拟的。每个传感器都有,只是数量不同而已。

2.1.2 哑像素(Dummy Pixel)

哑像素就完全是另一回事了。它们不是用来感光的,而是用于信号读出的时序对齐。你可以把它们理解为传感器读出电路里的「缓冲地带」。

我记得有一次调试一个高帧率项目,发现图像左侧有一条垂直亮线。排查了半天,最后发现是哑像素的读出时序没配好,导致参考电平偏移了。嗯,这种坑我踩过不止一次。

对比项 光学暗区 哑像素
物理结构 被金属遮挡,无光照 存在但未用于感光
主要用途 监测暗电流,用于BLC校准 时序对齐,信号读出缓冲
输出值意义 反映真实暗电平 通常不用于校准
数量 每行/每列若干像素 通常位于行/列首尾

注意:有些ISP方案会把哑像素也纳入BLC统计,这会导致校准偏差。我建议你务必确认硬件文档,搞清楚哪些是真正的光学暗区。

2.2 BLC校准目标值:到底要减到多少?

搞清楚了暗区的来源,接下来就是核心问题:BLC校准的目标值是多少?

很多人以为目标值是0,其实不对。为什么?因为传感器输出的是数字码值,而ADC是有参考电平的。通常我们会把目标值设定为一个非零的基准值,比如64、128、256等。

我个人习惯的做法是:

  • 10-bit传感器:目标值设为64(约满量程的6.25%)
  • 12-bit传感器:目标值设为256(约满量程的6.25%)
  • 14-bit传感器:目标值设为1024(约满量程的6.25%)

为什么会选6.25%?说白了,这是为了给暗部细节留出空间。如果目标值设得太低,暗部噪声会被削底;设得太高,又会压缩动态范围。6.25%是我在多个项目中验证过的经验值,当然你也可以根据具体场景微调。

小技巧:如果你做的是安防监控类产品,目标值可以适当提高(比如8%),因为暗部细节更重要。如果是消费电子,可以降低到4%,画面会更通透。

2.3 BLC校准的数学公式:其实很简单

好了,理论讲完了,咱们上公式。BLC校准的数学表达其实非常直观:

// 基本BLC校准公式
Output = Input - (OB_avg - Target)

其中:
- Input:原始像素值
- OB_avg:光学暗区像素的平均值
- Target:设定的目标码值
- Output:校准后的像素值

举个例子你就明白了:

假设:
- 传感器是12-bit,目标值设为256
- 当前光学暗区平均值为312
- 某个有效像素的原始值为1800

计算:
Offset = 312 - 256 = 56
Output = 1800 - 56 = 1744

你看,就是这么简单。但实际工程中,我们不会对每个像素都做这个计算,那样效率太低了。通常会采用行级或帧级校准

// 行级BLC校准(常用方案)
for each row:
    ob_mean = average(optical_black_pixels[row])
    offset = ob_mean - target
    for each pixel in row:
        pixel_out = pixel_in - offset

// 帧级BLC校准(低功耗方案)
frame_ob_mean = average(all_optical_black_pixels)
frame_offset = frame_ob_mean - target
for each pixel in frame:
    pixel_out = pixel_in - frame_offset

实战建议:我个人更推荐行级校准。虽然计算量稍大,但能有效消除行间暗电流差异。帧级校准虽然省资源,但遇到温度快速变化时,容易出现行噪声。

2.4 知识体系总览

为了让大家更直观地理解本章的知识结构,我画了一张图:

BLC校准原理知识体系 光学暗区 • 物理遮挡像素 • 实时监测暗电流 • 硬件设计产物 • 用于BLC统计 哑像素 • 时序对齐缓冲 • 不用于感光 • 信号读出用途 • 通常不参与校准 目标值与公式 • 目标码值设定 • 6.25%经验值 • Output = Input - Offset • 行级/帧级校准 核心逻辑总结 1. 光学暗区提供真实的暗电流参考 2. 哑像素不参与BLC统计,避免引入误差 3. 目标码值设定需平衡暗部细节与动态范围 4. 行级校准优于帧级校准,能抑制行噪声

2.5 避坑指南

最后,分享几个我亲身踩过的坑:

  • 我曾经在一个项目中直接用帧级校准,结果画面出现横向条纹。排查了两天才发现是温度变化导致行间暗电流差异,换成行级校准就解决了。
  • 我曾经把哑像素当成光学暗区来统计,结果BLC校准值一直偏大,图像整体偏暗。后来仔细看了datasheet才纠正过来。
  • 我建议你在做BLC校准前,先用示波器量一下传感器的模拟输出,确认暗区像素的电压是否稳定。有时候问题出在硬件供电上,软件怎么调都没用。

好了,这一章的内容就到这里。记住这三个核心点:光学暗区是硬件遮挡的像素,哑像素是时序缓冲,目标值设定要留有余量。把这些搞清楚了,BLC校准你就掌握了八成。


公众号:蓝海资料掘金营,微信deep3321