简介
上一篇博客介绍了如何在FPGA中利用shift-ram实现行缓存,然后得到3x3卷积模板,这回就来利用这个3x3窗口进行均值滤波。
均值滤波是典型的线性滤波算法,它是指在图像上对目标像素给一个模板,该模板包括了其周围的临近像素(以目标象素为中心的周围 8 个像素,构成一个滤波模板,即去掉目标像素本身),再用模板中的全体像素的平均值来代替原来像素值。
output = (p11 + p12 + p13 + p21 + p23 + p31 + p32 + p33) / 8
根据公式,可以将其分解为三级流水线:
- 第一级处理3x3窗口每一行的加法
- 第二级处理全部加法
- 第三级处理移位,即除以8
模块简介
为了简单起见,输入输出都是valid+data形式:
module mean_filter(
input clk,
input rst_n,
input iValid,
input [7:0] iData,
output oValid,
output [7:0] oData
);
均值滤波算法的实现
获取3x3卷积模板
上一篇博客有介绍如何获取3x3卷积模板,感兴趣的可以看看
需要注意获取3x3卷积模板消耗了2时钟周期。
filter_3x3 inst_filter_3x3(
.clk (clk),
.rst_n (rst_n),
.iValid (iValid),
.iData (iData),
.oValid (filter_oValid