首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >【ISP】滑窗卷积&可分离一维卷积

【ISP】滑窗卷积&可分离一维卷积

作者头像
AomanHao
发布于 2026-11-09 09:08:18
发布于 2026-11-09 09:08:18
170
举报

二维滑窗卷积 & 横向 + 纵向依次一维卷积

FPGA在做滑窗滤波的时候,缓存多行数据,选取以当前像素中心的窗口与滤波算子做卷积。这个是常见做法,了解到横向 + 纵向依次一维卷积,可以减少运算量。

先沿水平方向做一维卷积,再沿竖直方向做一维卷积,等价于:可分离卷积(separable convolution);只有当二维核是可分离核时,它才和直接二维滑窗卷积结果完全一样;否则二者输出不同。

1. 方案流程

1.1 可分离卷积

方案1 :横向一维卷积 → 纵向一维卷积(可分离卷积) 如果二维核 K 可以拆成外积: 流程:

  1. 对每一行,用一维核 (\boldsymbol{v}) 沿列滑动卷积,得到中间图 I_1
  2. 对 I_1 的每一列,用一维核 (\boldsymbol{u}) 沿行滑动卷积,得到最终结果 I_{out}

当且仅当二维卷积核可分离,横纵一维卷积才相当于二维滑窗卷积

1.1.1 典型可分离核可用
  • 高斯核:二维高斯可以拆成水平、竖直两个一维高斯
  • 均值盒滤波(矩形平均核)
  • Sobel、Prewitt 梯度核
1.1.2 任意二维核不可分离不可用

绝大多数任意二维核(任意纹理模板、Laplacian、自定义不规则核)不能写成两个一维向量外积。

例如中值滤波、双边滤波、NLMeans、最大值滤波 此时 “先横后竖一维卷积” 是另一个滤波器,不等于直接二维滑窗。

1.2 二维滑窗卷积

方案 2:标准二维滑窗卷积 在图像上滑动一个二维窗口,假设滑窗大小3x3,当前像素进来,缓存两行数据,第三行数据流入,第二行数据为中心的窗口内像素与二维核逐点相乘、累加,输出:

原始图:

滑窗滤波图:

2. 计算复杂度对比

假设:图像分辨率H\times W,一维核长度 k;对应二维核 (k\times k),步长 1,same 填充。

2.1 直接二维滑窗卷积:

每个输出点需要 (k^2k2k^2k2) 次乘法,全图需要O(HWk^2)O(H∗W∗k2)O(HWk^2)O(H∗W∗k2)次乘法

2.2 先后两次一维卷积(可分离):

每行一维卷积 O(Wk),一共 H 行;然后每列一维卷积 O(Hk),一共 W 列 O(HWk + WHk) = O(2HWk)

当 k 比较大时消耗资源差距巨大

3 可分离卷积方案实现

在纵向的一维卷积涉及到纵向滤波窗口的设定,可以分为全帧缓存、分块缓存等方案,全帧缓存延迟一帧时间。

如果系统对端到端延迟要求苛刻(例如激光、伺服、视觉闭环),哪怕可分离卷积时序更好,很多时候依然宁愿用二维滑窗;除非用 tiling 把延迟压到指标内。

3.1 全帧缓存方案(一帧延迟)

流程:

  1. 像素光栅输入,行方向一维卷积,输出中间像素;
  2. 中间像素不断写入帧缓存(BRAM / DDR);
  3. 等待整帧接收、写入完毕;帧结束信号到来;
  4. 再启动读通道,按列读出,送入列一维卷积;
  5. 生成最终输出帧。

延迟:

从第一个输入像素进入,到第一个有效输出像素出来:差不多是 1 帧的时间;

很多离线处理、对 latency 不敏感的 ISP 可以接受;但如果是实时预览、闭环控制、高速视觉跟踪,这个延迟往往不能接受。

3.2. 分块 Tile:把帧延迟压成块延迟

  • 在输入图像上切成矩形小块;
  • 对一个 tile:跑完行一维,把这个 tile 的中间结果存入小块缓存;
  • 只要 tile 写满,不需要等整张图,就启动这个 tile 的列向处理;
  • 流水线重叠:一边接收下一个 tile,一边处理上一个 tile。

3.3 延迟时间总结

  • 二维滑窗(Line Buffer):只有窗口大小带来的固定行延迟,不需要等任何一帧;第一个像素进来,经过少数行缓冲延迟之后,就持续吐出输出;属于低延迟流式通路,没有帧延迟。
  • 分离卷积,全帧中间缓存:第一个输出要等一帧,帧延迟。
  • 分离卷积 + tile / 转置 buffer:延迟介于二者之间,可以调。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2026-11-08,如有侵权请联系 cloudcommunity@tencent.com 删除
目录
  • 二维滑窗卷积 & 横向 + 纵向依次一维卷积
  • 1. 方案流程
    • 1.1 可分离卷积
      • 1.1.1 典型可分离核可用
      • 1.1.2 任意二维核不可分离不可用
    • 1.2 二维滑窗卷积
  • 2. 计算复杂度对比
    • 2.1 直接二维滑窗卷积:
    • 2.2 先后两次一维卷积(可分离):
  • 3 可分离卷积方案实现
    • 3.1 全帧缓存方案(一帧延迟)
    • 3.2. 分块 Tile:把帧延迟压成块延迟
    • 3.3 延迟时间总结
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档