ISP Pipeline中Lv实现方式探究之五--lv值计算框架优化

张开发
2026/4/9 0:32:36 15 分钟阅读

分享文章

ISP Pipeline中Lv实现方式探究之五--lv值计算框架优化
ISP Pipeline中Lv实现方式探究之一ISP Pipeline中Lv实现方式探究之二ISP Pipeline中Lv实现方式探究之三--lv计算定点实现ISP Pipeline中Lv实现方式探究之四----正LV值定点实现上述博文中详细阐述了根据Lv值进行亮度场景的划分原理。安防领域的实际应用中为了适配任何sensor绝大部分帧率的情况下Lv值的计算应该和帧率无关且为了方便线性插值Lv各个节点应该也要符合2的n次方的趋势在log2的对数域则变成了等间隔的节点表现形式。同时为了兼顾安防领域中最低5帧的实际使用场景和加快线性插值速度。对以上博文中的方法进行了一定优化。一、Lv值的计算公式LV log₂(1/(T·Gain)) Lv_Offset其中T表示秒为单位的曝光时间Gain为总的增益倍数Lv_offset8二、Lv节点具体表现前 7 段T1/256,1/128,1/64,1/32,1/16,1/8,1/4Gain1后 10 段T1/4Gain1,2,4,8,16,32,64,128,256,512Q8 定点256真值表如下节点类型T 曝光Gain原始 LV(log₂(1/(T*G)))偏移后 LV(8)Q8 定点值(偏移后 ×256)1曝光1/2561816.040962曝光1/1281715.038403曝光1/641614.035844曝光1/321513.033285曝光1/161412.030726曝光1/81311.028167曝光1/41210.025608增益1/41210.025609增益1/4219.0230410增益1/4408.0204811增益1/48-17.0179212增益1/416-26.0153613增益1/432-35.0128014增益1/464-44.0102415增益1/4128-53.076816增益1/4256-62.051217增益1/4512-71.0256三、下述类似Lv节点代码实现#include stdint.h #include stdio.h // Q8 定点配置 #define Q8 256 // Q8 格式1.0 256 #define NODE_NUM 17 // 17个固定节点 // LV LUT偏移后 Q8 const int16_t lv_lut_q8[NODE_NUM] { 4096, 3840, 3584, 3328, 3072, 2816, 2560, 2560, 2304, 2048, 1792, 1536, 1280, 1024, 768, 512, 256 }; // 权重表保持原始数值不变 const int16_t weight_lut_q8[NODE_NUM] { 102, 205, 307, 410, 512, 614, 717, 1024, 1126, 1229, 1331, 1434, 1536, 1638, 1741, 1843, 1946 }; // // 线性插值输入 LV_Q8 → 输出插值权重 // 无浮点、无溢出、无除零、方向正确 // int16_t get_weight(int16_t input_lv) { int i; // 上限保护 if (input_lv lv_lut_q8[0]) return weight_lut_q8[0]; // 下限保护 if (input_lv lv_lut_q8[NODE_NUM - 1]) return weight_lut_q8[NODE_NUM - 1]; // 区间查找LV 从大到小 for (i 0; i NODE_NUM - 1; i) { int16_t lv_h lv_lut_q8[i]; int16_t lv_l lv_lut_q8[i 1]; if (input_lv lv_h input_lv lv_l) { int32_t wt_h weight_lut_q8[i]; int32_t wt_l weight_lut_q8[i 1]; int32_t dv lv_h - lv_l; int32_t dw wt_h - wt_l; int32_t pos input_lv - lv_l; int32_t res wt_l (dw * pos) / dv; return (int16_t)res; } } return weight_lut_q8[0]; } // // 测试函数 // int main(void) { // 测试LV14 → Q814*2563584 int16_t test_lv 3584; int16_t out_wt get_weight(test_lv); printf(输入 LV_Q8 %d\n, test_lv); printf(输出权重 Q8 %d\n, out_wt); printf(浮点权重 %.2f\n, out_wt / 256.0f); return 0; }

更多文章