
海思自研的 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 最核心的创新:
- 8 方向梯度计算:计算 0°、45°、90°、135° 等 8 个方向的梯度
- 方向置信度:根据梯度差计算每个方向的可信度(0~1)
- 加权插值:沿高置信度方向进行插值,低置信度方向被抑制
数学表达:
plaintext
沿水平方向插值权重 = exp(-|梯度水平| / σ)
沿垂直方向插值权重 = exp(-|梯度垂直| / σ)
参数作用:
- 控制高频边缘的过冲(Overshoot)幅度
- 值越大:边缘越锐利,但容易出现白边、振铃效应
- 值越小:边缘柔和,但画面偏软
联合体设计说明 :
nddm_hf_detail_strength和hf_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 关键技术点
- 平滑过渡:硬件做线性插值,不会出现参数跳变
- 无延迟:参数表预存在 ISP 寄存器,切换 0 延迟
- 独立控制:每个参数可以独立设计曲线,不需要同步
- 可动态更新:运行时可以修改数组内容,立即生效
五、调试技巧
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 生产级调试流程
- 先调 Manual 模式,确定每个关键 ISO 点的最优参数
- 将这些关键点填入 Auto 数组对应位置
- 中间档位做线性插值填充
- 实拍验证 ISO 连续变化时的过渡平滑性
这就是海思 Demosaic 自动模式的完整原理 ------ 本质就是16 点分段线性查表,简单但极其实用,是商用 ISP 的标准设计。