目录

在利用不同主控调试ISP图像质量的时候,会发现主控端会提供Lv(Bv)值,和利用ISO进行节点划分,用以进行图像效果参数(BLC、sharp、3dnr等模块参数)标定的两套系统。这两套系统和曝光参数都有关联。
计算Lv的系统中,假设Lv的计算如下:
其中,T表示以秒(S)为单位的曝光时间,ISO表示总的增益倍数,C为某一常数。
以ISO为节点进行图像效果参数标定的系统中,ISO一般表示相应的增益倍数。
诸如海思的去马赛克ISO节点表示如下:

诸如Novatek去马赛克ISO节点参数设置:

Novatek白平衡Lv值的设置

海思白平衡Bv值的设置

那么,我们就有必要探究下为什么ISP图像效果调试中设计这两套系统呢?
或者说这两套系统有什么不一样的侧重点呢?
我们可以先总结下结论,稍后再详细分析。
- 利用ISO(增益阶)设计的节点,主要是为了适配各个增益下的画质底噪。由于曝光时间主要影响图像的运动拖影、频闪、画面的进光量,不直接决定原生高斯噪声、彩噪、噪声的颗粒表现。由于增益越大,放大电路对噪声也不同程度的放大,直接影响噪声的具体表现。因此,利用ISO节点对应的调试好的ISP参数,可以内部根据增益大小进行线性插值,生成对应不同ISO下的图像画质参数,避免图像画质存在可能的突变,使得画质表现更加平滑稳定。否则,可能在收敛过程中某些场景存在噪声、色噪跳变的表现,污染画质。
- 利用Lv主要表征纯环境的客观亮度。一般用来判断场景亮度用来测光。另外,有一些主控使用APEX测光系统,利用lv(bv)值进行自动曝光算法的输入,进行自动曝光调整。
一、利用ISO分级进行全链路ISP参数联动调整
我们知道图像的噪声主要受到增益的影响,包括模拟增益、数字增益以及ispdgain。增益越大,其对噪声的放大程度越大。因此,我们标定ISO对应的ISP参数时,是以增益为档位进行标定调试。
标定用的「ISO / 增益节点」只代表:噪点放大倍数(图像底噪等级)
- 管:3DNR、2DNR、锐化、彩噪抑制。凡是需要随增益变化调整的模块都需要按照ISO调整。
- 不管:画面亮不亮、环境明暗、快门多长
- 特点:离散档位(100/200/400...),按 2 倍 EV 跳
如下海思的去马赛克ISO节点表示如下:

- ISO100 → 基准最低增益(原生最干净)
- ISO200 → ×2 增益
- ISO400 → ×4 增益
- ISO800 → ×8 增益
......
后面超大 ISO(几十万、几百万):是超高数字增益档位,对应极暗光全拉高增益场景,只用来切极限强降噪、压彩噪、锁色彩。
如果我们从十进制数值看到的是前密后疏的数值分布情况。比如:
100→200(差 100)、1600→3200(差 1600)、几十跳几百万。
这是十进制数字的视觉假象,在感光/ EV / 数域里间隔完均等!
虽然是十制制数字看着大,不均等分布,当是在对数域长永远匀。关于对数域这部分的数学科普推荐参考《数学的雨伞下--理解世界的乐趣》第一章。
那曝光时间(快门)去哪了?
- 快门不进 ISP 画质插值节点,只做两件事:
- AE 闭环控亮度、防 50/60Hz 频闪
- 控拖影(低帧限最大快门,比如你 10fps 限 0.1s)
- 同一 ISO(同一增益节点)下:
- 快门可以随便变长 / 变短,ISP 降噪 / 色彩参数不插值、不跳变
- ------ 因为噪点底子没变,只是进光多少变了
为什么以2的n次方进行isp参数锚点的构建呢?
- 每一个档位对应人眼+物理SNR的一阶恶化阶梯。Sensor噪声随增益指数级上涨。2的n次方刚好匹配SNR衰减曲线。分档位做NR/Sharp/3dnr/BLC标定,逻辑最顺、调试工作最少;
- 原生的sensor模拟增益大多数是线性分段+数字增益细调进行平滑,增益实际调整也是相对平滑的,并不是纯2倍的跳变。工具端或者ISP驱动库内部根据这些ISO基准锚点进行全链路ISP模块参数的线性插值,减少图像调试工作量、减少ISP参数占用内存的大小,量产维护成本低;
- 通过线性插值使得画质过渡更加自然平滑。噪声涨多少,参数就平滑多少,无断层,无跳变;
- 另外对齐通用标称规范。我们使用手机的专业模式拍照时,常常有看到有ISO的设置,适配上层协议、客户端UI、测试标准;
- 相反,如果使用非2的n次方档位。比如线性档位进行ISP参数的标定,那么在高ISO区噪声暴增,如果档位太过稀疏的话,NR/3dnr/Sharp等参数一档抗不住,要么噪声太多,要么太过模糊。那么需要分过多档位进行ISP参数调试,增加调试工作量。
二、利用Lv值识别场景亮度
Lv值是剥离当前快门 + 增益后的「纯环境客观亮度」
- 跟当前增益大小无关、跟当前快门无关
- 只反映:现在室外 / 室内 / 暗光到底有多亮
- 特点:连续浮点 / 定点,无限平滑
作用:判场景、判亮度、做平滑联动。
比如我们需要根据场景亮度对各个色温的统计数据做权重设置,通过权重设置的方式避免诸如室外对着土黄色识别为低色温场景的情况;也可以通过权重的设置调整白平衡色调的偏向。比如Sigmastart下的这种设置,通过控制不同色温不同亮度下的权重进行色调的偏向和干扰色的排除。

Lv值可以用来区分室内、室外、暗光、极暗光等不同亮度场景。
可以用来ircut的日夜切换、HDR开关、帧率切换、黑电平调整等等LV阈值触发策略。
这种LV阈值触发的策略,如果单独使用ISO值是无法做到的。假设曝光优先的情况下,在曝光没打满的前提下,AE都是使用的1倍ISO,如果单独使用ISO值做亮度相关的触发策略的发,曝光时间所覆盖的对应的场景则无法区分。
此外,也有利用EV=again*dgain*ispdgain*exp的方式来对场景亮度进行分级。但是由于isp驱动库内部一般都是定点计算,即上述的所有增益需要转换到整数进行计算。比如1倍增益为1024,2倍增益为2048,后续以此类推。使用定点后的增益计算EV值的时候,有可能发生溢出的情况。而且,如果需要对分级亮度的某些场景对应的权重参数进行插值的时候,有可能出现插值失效的情况。具体可以参考博文: 线性插值中当x,y坐标的数值大小数量级相差太大导致的问题
那么是否可以利用LV值作为调试画质参数的锚点呢?
我们知道同样亮度的场景下,假设我们使用10ms、2倍增益达到合适亮度;也可以使用20ms,1倍增益达到一样的合适亮度。这两种情况下计算的Lv值基本一样。但是10ms、2倍增益的噪声表现和20ms,1倍增益的噪声表现天差地别。特别是低照度下的这种情况,噪声表现差异将更大。如果使用LV进行画质参数的锚点,此时这两种情况下计算的Lv值基本一致,而噪声表现差异较大。不可能使用一套参数兼顾这两种噪声不一样的情况。因此,绝对不能使用Lv值对画质参数进行锚点插值操作。
另外,我们计算Lv值的时候会使用对数函数,计算的Lv值也是小数。如果驱动库底层需要在利用Lv值触发相关策略时。由于驱动底层绝大部分都只能使用整数而非小数,直接利用小数是进行触发是行不通的。此时,我们需要将对数计算的值进行定点处理。比如对对数函数计算的值放大256或者1024倍,底层驱动利用放大后的值进行相应处理;或者利用定点对数函数实现相关计算。
那么如何构建一个LV计算的公式呢?
是否认为直接使用上述文章开头的公式就可行呢?
或者说是根据文章开头的公式进行适当变形,得到其变体计算LV值?
得到合适的计还是说另有其他更合适的公式计算?待思考验证!!