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 知识体系总览
为了让大家更直观地理解本章的知识结构,我画了一张图:
2.5 避坑指南
最后,分享几个我亲身踩过的坑:
- 我曾经在一个项目中直接用帧级校准,结果画面出现横向条纹。排查了两天才发现是温度变化导致行间暗电流差异,换成行级校准就解决了。
- 我曾经把哑像素当成光学暗区来统计,结果BLC校准值一直偏大,图像整体偏暗。后来仔细看了datasheet才纠正过来。
- 我建议你在做BLC校准前,先用示波器量一下传感器的模拟输出,确认暗区像素的电压是否稳定。有时候问题出在硬件供电上,软件怎么调都没用。
好了,这一章的内容就到这里。记住这三个核心点:光学暗区是硬件遮挡的像素,哑像素是时序缓冲,目标值设定要留有余量。把这些搞清楚了,BLC校准你就掌握了八成。
公众号:蓝海资料掘金营,微信deep3321