3519dv500 ISP学习

海思自研的 NDDM(Noise-Aware Directional Demosaic,噪声感知方向型去马赛克) 算法,是海思 ISP 的核心技术,广泛应用于 HI3519DV500、HI3516DV500 等平台。

一、传统 Demosaic 的痛点

1.1 基础问题

Sensor 的 Bayer 阵列每个像素只有一个颜色通道(R/G/B),Demosaic 需要插值推算缺失的两个通道

plaintext

复制代码
G R G R G
B G B G B
G R G R G

1.2 传统算法的缺陷

  • 双线性插值:简单平均,但边缘处会严重模糊、产生锯齿
  • 方向插值(如 Malvar) :沿边缘方向插值,但对噪声极度敏感
  • 高频细节丢失:去马赛克后纹理、文字边缘模糊
  • 伪色(False Color):边缘处出现彩色拉链效应(Zipper Effect)

二、海思 NDDM 算法核心架构

海思 NDDM 是三代技术演进 的结果,核心设计思想:"先判方向→再做插值→噪声自适应→后处理抑制伪色"

plaintext

复制代码
┌─────────────────────────────────────────────────┐
│           NDDM 算法流水线                        │
├─────────────────────────────────────────────────┤
│  1. 方向检测与置信度计算  →  确定插值方向         │
│  2. 多尺度细节分解      →  分离中/高频细节        │
│  3. 噪声感知插值        →  根据噪声强度自适应     │
│  4. 色差域伪色抑制      →  Y/F通道分别处理        │
│  5. 细节平滑过渡        →  消除插值不连续         │
└─────────────────────────────────────────────────┘

三、逐字段原理详解

3.1 nddm_strength - 算法总强度

作用原理

  • 全局控制 NDDM 算法的介入程度,0 = 关闭(退化为基础双线性),255 = 最大强度

  • 本质是方向插值权重传统双线性权重 的混合系数:

    plaintext

    复制代码
    最终结果 = NDDM结果 × strength + 双线性结果 × (1-strength)
  • 低照度下建议降低此值,避免放大噪声

3.2 nddm_mf_detail_strength - 中频细节增强

核心原理:多尺度细节分解

海思将图像分解为两个频带:

  • 中频(MF, Medium Frequency):纹理、毛发、布料纹理等
  • 高频(HF, High Frequency):硬边缘、文字、线条等

中频插值策略

  • 使用5×5 邻域的方向相关性计算

  • 对中频区域采用更保守的方向判断,避免误判产生伪色

  • 此参数控制中频细节的恢复增益

    plaintext

    复制代码
    细节增益 = 1.0 + mf_strength / 128.0
  • 值过大:纹理区域出现颗粒感;值过小:画面发闷、不通透

3.3 nddm_hf_detail_strength / hf_detail_strength - 高频细节增强

核心原理:方向置信度加权插值

这是 NDDM 最核心的创新:

  1. 8 方向梯度计算:计算 0°、45°、90°、135° 等 8 个方向的梯度
  2. 方向置信度:根据梯度差计算每个方向的可信度(0~1)
  3. 加权插值:沿高置信度方向进行插值,低置信度方向被抑制

数学表达

plaintext

复制代码
沿水平方向插值权重 = exp(-|梯度水平| / σ)
沿垂直方向插值权重 = exp(-|梯度垂直| / σ)

参数作用

  • 控制高频边缘的过冲(Overshoot)幅度
  • 值越大:边缘越锐利,但容易出现白边、振铃效应
  • 值越小:边缘柔和,但画面偏软

联合体设计说明nddm_hf_detail_strengthhf_detail_strength 是新旧 API 兼容设计,功能完全一致

3.4 detail_smooth_range - 细节平滑范围

作用原理:过渡区平滑

方向插值在方向突变处(如从水平边缘转到垂直边缘)会产生不连续。此参数控制:

  • 方向置信度的平滑滤波半径
  • 值 = 0:无平滑,方向判断最锐利但易出现块状伪影
  • 值增大:3×3 → 5×5 → 7×7 邻域平滑,方向判断更稳定
  • 典型值:8~16(对应 5×5 邻域

四、色噪抑制模块(核心创新)

这是海思 NDDM 区别于开源算法的关键:在色差域做噪声感知

4.1 色彩空间转换

海思不在 RGB 域处理,而是转换到YF 色差空间

plaintext

复制代码
  Y = 0.299R + 0.587G + 0.114B  (亮度通道)
  F = R - B                     (色差通道,对应蓝黄轴)

4.2 color_noise_y_threshold / color_noise_y_strength

亮度通道噪声抑制

  • 阈值判断:局部方差 < threshold → 判断为平坦区,强降噪
  • 强度控制 :对判定为噪声的区域执行自适应双边滤波
  • 亮度噪声表现为:颗粒感、黑白噪点

4.3 color_noise_f_threshold / color_noise_f_strength

色差通道噪声抑制

  • 伪色产生根源:方向误判导致 R/B 插值错误,表现为彩色斑点
  • 阈值作用:色差梯度 < threshold → 判定为色噪,执行中值滤波
  • 强度作用:控制色噪抑制的强度,过大导致色彩饱和度下降

关键洞察

人眼对亮度噪声不敏感 ,但对彩色噪声极度敏感。所以海思设计:F 通道的阈值通常远小于 Y 通道,色噪抑制强度远大于亮度噪声抑制。

五、NDDM vs 传统算法的技术差异

表格

特性 传统方向插值 海思 NDDM
方向数量 2~4 方向 8 方向 + 置信度
噪声感知 有,Y/F 双通道自适应
细节处理 单尺度 多尺度(MF/HF 分离)
伪色抑制 无后处理 色差域专门抑制
低照度表现 噪声被放大 自动降低细节强度
硬件加速 海思 ISP 专用硬件流水线

六、典型场景参数配置参考

6.1 白天清晰场景(室外、光线充足)

c

运行

复制代码
nddm_strength = 220;          // 全开方向插值
nddm_mf_detail_strength = 180; // 充分恢复纹理
nddm_hf_detail_strength = 200; // 边缘锐利
detail_smooth_range = 8;
color_noise_y_threshold = 20;
color_noise_f_threshold = 10;  // 轻微色噪抑制

6.2 低照度夜景(Gain > 16x)

c

运行

复制代码
nddm_strength = 120;          // 降低方向插值,避免噪声放大
nddm_mf_detail_strength = 80;  // 减少纹理增强,避免颗粒感
nddm_hf_detail_strength = 100; // 边缘不要过锐
detail_smooth_range = 16;      // 增大平滑,稳定方向判断
color_noise_y_threshold = 60;  // 强降噪
color_noise_f_threshold = 40;  // 强色噪抑制

6.3 文字 / 条码场景(高对比度边缘)

c

运行

复制代码
nddm_hf_detail_strength = 240; // 极限锐化
detail_smooth_range = 4;       // 最小平滑,保证边缘定位
color_noise_f_strength = 200;  // 防止边缘彩色拉链

七、调试常见问题

表格

现象 原因 解决方向
边缘出现彩色条纹 方向误判 + F 通道噪声 降低 hf_detail,提高 f_threshold
画面发闷不通透 中频细节被抑制 提高 mf_detail_strength
纹理区域颗粒感 MF 强度过高 降低 mf_detail,提高 smooth_range
夜景噪点多 NDDM 强度过高放大噪声 降低 nddm_strength 总开关
文字边缘白边 HF 过冲 降低 hf_detail 至 160 以下

这就是海思 NDDM 去马赛克算法的完整原理。本质上是 **"方向插值 + 多尺度分解 + 噪声感知 + 色差域后处理"** 的四阶段流水线,每个参数对应流水线中一个具体环节的增益或阈值。

复制代码
static const ot_isp_demosaic_attr g_cmos_demosaic = {
    1, /* en */
    OT_OP_MODE_AUTO, /* op_type */
    128, /* ai_detail_strength */
    {
        48, /* nddm_strength */
        64, /* nddm_mf_detail_strength */
        { 0 }, /* nddm_hf_detail_strength */
        2, /* detail_smooth_range */
        0, /* color_noise_f_threshold */
        8, /* color_noise_f_strength */
        1, /* color_noise_y_threshold */
        10, /* color_noise_y_strength */
    },
    {
        /* nddm_strength */
        { 48, 48, 48, 54, 54, 54, 48, 40, 40, 48, 48, 48, 48, 48, 48, 48 },
        /* nddm_mf_detail_strength */
        { 82, 74, 68, 60, 54, 50, 44, 40, 40, 40, 40, 32, 16, 16, 16, 16 },
        /* nddm_hf_detail_strength */
        {
            { 0, 0, 1, 2, 4, 6, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8 },
        },
        /* detail_smooth_range */
        { 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 3, 5, 7, 7, 7, 7 },
        /* color_noise_f_threshold */
        { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
        /* color_noise_f_strength */
        { 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8 },
        /* color_noise_y_threshold */
        { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 },
        /* color_noise_y_strength */
        { 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10 },
    }
};

海思 ISP Demosaic 自动模式(Auto)原理详解

这是海思 ISP 的 Auto 自动模式结构体 ot_isp_demosaic_auto_attr,是海思 ISP 最核心的设计之一 ------ISO 分段自适应调节

一、Auto vs Manual 模式本质区别

表格

模式 结构体 工作方式 适用场景
Manual 手动 ot_isp_demosaic_manual_attr 固定参数,不随 ISO 变化 实验室调试、固定光照
Auto 自动 ot_isp_demosaic_auto_attr 参数随 ISO 动态变化 实际产品,光照变化场景

关键设计 :每个参数都变成数组 [OT_ISP_AUTO_ISO_NUM]

二、OT_ISP_AUTO_ISO_NUM 详解

2.1 ISO 分段机制

海思 ISP 将整个 ISO 范围(通常 0~102400)均匀划分为 16 个档位

c

运行

复制代码
#define OT_ISP_AUTO_ISO_NUM  16   // 固定16档,海思所有平台统一

分段示例(典型划分)

表格

数组索引 ISO 范围 光照场景
0 0 ~ 50 强光、晴天室外
1 50 ~ 100 明亮室内
2 100 ~ 200 普通室内
3 200 ~ 400 阴天 / 黄昏
4 400 ~ 800 弱光
5 ~ 15 800 ~ 102400 低照度、夜景

2.2 自动插值原理(核心算法)

AE 模块输出实时 ISO 值 后,ISP 硬件自动执行线性插值

plaintext

复制代码
例如:当前ISO = 300
  → 落在第2档(ISO=200) 和 第3档(ISO=400) 之间
  → 插值系数 = (300-200)/(400-200) = 0.5
  → 实际参数 = param[2] × 0.5 + param[3] × 0.5

硬件实时计算,完全不需要 CPU 干预,这就是海思 ISP"自动" 的本质。


三、参数曲线设计原则

3.1 典型参数变化趋势

所有参数都应该遵循 **"ISO 升高→降噪增强→锐化降低"** 的原则:

表格

参数 ISO 0~100(强光) ISO 800+(夜景) 变化趋势
nddm_strength 220~240 100~140 ↓ 下降
nddm_mf_detail_strength 180~200 60~100 ↓ 下降
nddm_hf_detail_strength 200~220 80~120 ↓ 下降
detail_smooth_range 4~8 16~24 ↑ 上升
color_noise_y_threshold 10~20 60~100 ↑ 上升
color_noise_f_threshold 5~10 40~80 ↑ 上升

3.2 标准配置表示例

c

运行

复制代码
// 典型的16档参数表(生产级配置)
td_u8 nddm_strength[16] = {
    240, 235, 230, 220,  // ISO 0-400: 高锐化
    200, 180, 160, 140,  // ISO 400-3200: 逐渐降低
    130, 120, 115, 110,  // ISO 3200+: 保守模式
    105, 100, 100, 100
};

td_u8 color_noise_f_threshold[16] = {
     8,  10,  12,  15,   // ISO 0-400: 轻微抑制
    20,  30,  40,  50,   // ISO 400-3200: 增强抑制
    60,  70,  75,  80,   // ISO 3200+: 强抑制
    85,  90,  95, 100
};

四、AE-ISP 联动机制

4.1 完整数据流

plaintext

复制代码
Sensor曝光 → AE算法计算Gain → 换算成ISO值
     ↓
ISP硬件自动查表 + 插值
     ↓
得到当前ISO对应的Demosaic所有参数
     ↓
硬件执行去马赛克处理

4.2 关键技术点

  1. 平滑过渡:硬件做线性插值,不会出现参数跳变
  2. 无延迟:参数表预存在 ISP 寄存器,切换 0 延迟
  3. 独立控制:每个参数可以独立设计曲线,不需要同步
  4. 可动态更新:运行时可以修改数组内容,立即生效

五、调试技巧

5.1 快速验证自动模式是否生效

c

运行

复制代码
// 极端测试:第0档全255,第15档全0
// 如果ISO升高时画面明显变软、噪点减少 → 自动插值正常工作

5.2 常见问题排查

表格

现象 原因 解决
ISO 变化时画面突然跳变 相邻档位参数差太大 曲线做平滑,相邻档差≤20
高 ISO 还是很锐但噪点多 高 ISO 档 nddm_strength 太高 8 以后降到 120 以下
低 ISO 画面偏软 低 ISO 档 detail 强度不够 0~3 提到 180+
某一档 ISO 出现明显伪色 该档 f_threshold 太低 单独调高对应索引值

5.3 生产级调试流程

  1. 先调 Manual 模式,确定每个关键 ISO 点的最优参数
  2. 将这些关键点填入 Auto 数组对应位置
  3. 中间档位做线性插值填充
  4. 实拍验证 ISO 连续变化时的过渡平滑性

这就是海思 Demosaic 自动模式的完整原理 ------ 本质就是16 点分段线性查表,简单但极其实用,是商用 ISP 的标准设计。