OpenISP 模块拆解 · 第13讲:边缘增强 (EEH)
模块定位
EEH 文档对应代码 model/eeh.py,类名 EE,即 Edge Enhancement。它通过边缘滤波器提取高频分量,再把经过 LUT/阈值控制的增强量加回原图。通常作用在 Y 通道,因为人眼主要通过亮度边缘感知清晰度。
边缘增强不是增加真实分辨率,而是提高局部对比,让边缘看起来更清楚。
背景原理
锐化常见形式是:
text
edge = high_pass(img)
out = img + gain * edge
如果直接对所有高频都增强,噪声也会被放大。因此工程锐化通常包含阈值、限幅、正负边缘控制和边缘图输出。
openISP 实现
EE 输入参数:
img: 单通道图像,通常是 Y。edge_filter: 3x5 边缘滤波器。gain: 两档增益。thres: 两个阈值。emclip: edge enhancement map 的限幅范围。
流程:
- 对图像做
((1,1),(2,2))reflect padding,以适配 3x5 filter。 - 对每个像素计算 edge map:
text
em = sum(window * edge_filter) / 8
- 用
emlut()根据阈值和 gain 计算增强量。 - 将增强量加回中心像素。
- 输出增强图和 edge map。
emlut 的含义
emlut() 把边缘响应分成几个区间:
- 很强的负边缘:用
gain[1]增强。 - 中等负边缘:抑制为 0。
- 弱响应区域:用
gain[0]轻微增强。 - 中等正边缘:抑制为 0。
- 很强的正边缘:用
gain[1]增强。
最后增强量除以 256 并限制在 emclip 范围内。
这种设计的目的,是避免对某些响应区间过度增强,同时限制 halo 和噪声放大。
为什么输出 edge map
execute() 返回 (增强后的图像, em_img)。这个 edge map 后续可以给 FCS 使用:伪彩往往出现在强边缘附近,FCS 可以根据边缘强度决定是否压低色度。
这体现了 ISP pipeline 中模块之间的联动:锐化模块不仅产生增强结果,也提供边缘信息给后续模块。
参数和调试
edge_filter: 决定检测什么方向和频率的边缘。gain: 越大锐化越强,但噪声和 halo 风险也越高。thres: 控制哪些边缘响应参与增强。emclip: 限制增强量,防止过冲。
调试时重点看文字、斜边、头发、树枝和高反差边缘。过强锐化会出现白边、黑边、颗粒感和不自然轮廓。
实现注意点
当前 clipping() 固定 clip 到 255,说明本模块假设输入输出是 8-bit 亮度图。若前级不是 8-bit,需要同步调整。
emlut() 中阈值区间存在一些边界未覆盖的情况,例如等于阈值时走默认 0。通常影响不大,但严格实现会明确所有边界。
学习重点
- EE 是高频增强,不是恢复真实细节。
- 锐化最好作用在亮度通道,避免彩色边缘。
- 阈值和 clip 是控制噪声、halo 的关键。
- edge map 可以服务于后续 FCS。
面试问答
Q1: 为什么锐化通常作用在 Y 通道?
人眼对亮度边缘更敏感。只锐化 Y 可以提升主观清晰度,同时避免放大色度噪声和伪彩。
Q2: EE 过强有什么现象?
会出现白边、黑边、halo、噪声颗粒增强,甚至让图像显得很硬。
Q3: 为什么 EE 需要阈值?
阈值能避免把微弱噪声当边缘增强,也能控制哪些边缘响应需要被抑制或强化。
Q4: EE 和降噪如何配合?
通常先降噪再锐化。否则锐化会把噪声当作细节放大。
Q5: edge map 为什么还能用于 FCS?
伪彩常出现在强边缘附近,edge map 能告诉 FCS 哪些位置更需要压制色度。