OpenISP 模块拆解 · 第12讲:双边滤波降噪 (BNF)
OpenISP 模块拆解 · 第12讲:双边滤波降噪 (BNF)
模块作用
BNF 是双边滤波降噪,openISP 中接在 NLM 后继续处理 Y 通道。它根据空间距离和灰度差异共同决定权重,在平滑噪声的同时尽量保护边缘。
openISP 实现
源码类名为BNF(img, dw, rw, rthres, clip)。
| 参数 | 含义 |
|---|---|
dw | 5x5 空间距离权重 |
rw | 灰度差分段权重 |
rthres | 灰度差阈值 |
clip | 输出上限 |
配置中的dw中心权重最大:
8 12 32 12 8 12 64 128 64 12 32 128 1024 128 32 12 64 128 64 12 8 12 32 12 8核心思想
对每个 5x5 邻域:
weight = spatial_weight * range_weight空间越近,spatial_weight越大;灰度越接近中心点,range_weight应越大。这样跨边缘的像素会因为灰度差大而权重低。
代码流程
- 对 Y 图做 2 像素 reflect padding。
- 遍历每个像素的 5x5 邻域。
- 计算邻居与中心的绝对差。
- 根据
rthres把差值映射成rw。 - 与
dw相乘得到总权重。 - 做加权平均。
- 裁剪输出。
读源码注意点
- 源码里每个像素都会
print("[x,y]..."),大图会非常慢且输出巨大。 rdiff变量后来被替换成 range weight,命名容易误导。- 阈值分支依赖
rthres=[128,32,8]这种从大到小的配置。
面试问答
Q1: 双边滤波为什么能保边?
因为它不仅看空间距离,还看像素值差异。边缘两侧即使空间上近,但灰度差大,range weight 低,因此不会被强烈平均。
Q2: BNF 和 NLM 的区别是什么?
BNF 是局部滤波,比较单像素灰度差;NLM 是非局部滤波,比较 patch 相似度。NLM 更复杂,BNF 更轻量。
Q3: range threshold 过大或过小有什么影响?
阈值过大时,跨边缘像素也可能参与平均,边缘变软。阈值过小时,只有极相似像素参与,降噪变弱。
Q4: 为什么双边滤波可能产生塑料感?
如果过度平滑,低纹理区域被抹得太干净,而边缘仍保留,会出现不自然的块面感或塑料质感。
Q5: BNF 一般放在锐化前还是后?
通常放在锐化前。先降噪再锐化,可以避免锐化把噪声当细节增强。
