FPGA 商用级 ISP:动态坏点校正(DPCC)的滑窗架构与并行判决实现
在数字图像处理领域,ISP(图像信号处理器)的算法原理并不罕见,但真正能够支持 4K@60fps 实时处理、并经过商用验证的 Verilog 硬核实现思路却往往封装在黑盒之中。本文基于对商用级 ISP 源码的深度拆解,分析其背后的设计逻辑,为 FPGA 开发者和 ISP 算法工程师提供一个硬核的设计基线。
为什么'商用级'坏点校正极其困难?
在传感器制造中,由于半导体工艺缺陷或后期老化,不可避免会出现常亮像素(Hot Pixel)或死像素(Dead Pixel)。商用级校正面临三大挑战:
- 误杀边缘:简单的中值滤波容易将真实的星星、细小线条甚至远处的文字当做坏点磨平,导致锐度丧失。
- 动态性:随着传感器温度升高或增益(Gain)加大,原本正常的像素可能变成噪声点,需要动态适应。
- 吞吐量:4K@60fps 的实时处理要求算法必须以流水线形式在极短的时钟周期内完成数以百计的逻辑比对。
硬件核心:5X5 同色像素滑窗生成
在 Bayer 格式下,直接邻域的像素颜色不同。商用设计首先要解决同色分量提取的问题。
Line Buffer 行缓存
设计中通过 Line Buffer 缓存 5 行 Raw 数据。硬件逻辑会从 5X5 的大矩阵中,根据当前的 Bayer 相位,提取出同色像素的子集合:
- 中心像素 (P_center) 与其周围 8 个同色邻域像素(P_1 到 P_8)。
- 逻辑开销:这一步在 Verilog 中是通过多级寄存器打拍和多路选择器(Mux)实现的,确保在每个 clk 周期,算法核心都能拿到一组完整的空间相关像素。
硬核算法展开:梯度判决公式的硬件实现
这套 IP 最精妙的地方在于其多准则并行判决逻辑。为了不误杀边缘,它引入了复杂的梯度计算。
动态梯度算子
算法会在多个方向计算梯度(差异值),硬件上并不直接使用复杂的方差公式,而是使用绝对值减法阵列来降低资源消耗:
// 伪逻辑:计算水平梯度
assign diff_h = (px_left > px_right) ? (px_left - px_right) : (px_right - px_left);
主要计算维度包括:
- 水平梯度:Gh = |P_left - P_right|
- 垂直梯度:Gv = |P_up - P_down|
- 对角线梯度:Gd1, Gd2
复合判决条件
一个点被判定为坏点,必须同时满足以下严苛条件:
- 极值判定:中心点像素值 P_center 必须是邻域内的极大值或极小值。
- 动态阈值比对:P_center 与邻域均值的差值,必须大于一个自适应阈值。
- 公式:|P_center - Median| > Threshold + (Avg_Gradient × Factor)
- 硬件实现:这里的 Factor(增益因子)通常通过移位(Shift)实现,避免使用高成本的除法器。源码中支持三套独立的判决准则,通过寄存器灵活配置。
边缘敏感保护
如果 Gh 很小但 Gv 很大,说明当前处于一条水平边缘线上。此时即使中心点偏离均值,算法也会通过比较各方向梯度,将'坏点判决'挂起(Inhibit),从而保护边缘不被修掉。这是防止图像细节丢失的关键逻辑。
动态校正:自适应插值
当判定结果为'坏'时,输出不再是 P_center,而是修复值。
- 静态表融合:硬件逻辑通过 FIFO 模块实时拉取静态坏点坐标,一旦与当前像素坐标匹配,会强制触发校正逻辑。
- 方向加权修复:硬件会寻找梯度最小(最平滑)的方向进行插值。


