简介
上一篇博客介绍了如何实现3x3均值滤波,本次就来实现3x3中值滤波。
中值滤波常用于去除图像的噪声,对椒盐噪声比较有效。
在每个3x3窗口中通过排序获取中间值作为输出即可。
在FPGA中以流水线方式获取3x3窗口的中值:
图中详细描述了取得中值的步骤,同时也描述了每一级流水线需要完成的任务:
- 对3x3窗口的每一行进行排序
- 对3个max排序,取最小,对3个mid排序,取mid,对3个min排序,取max
- 对第二步产生的三个数进行排序,得到中值
模块简介
为了简单起见,输入输出都是valid+data形式:
module mid_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),
.oData_11 (filter_11), .oData_12 (filter_12), .oData_13 (filter_13),
.oData_21 (filter_21), .oData_22 (filter_22), .oData_23 (filter_23),
.oData_31 (filter_31), .oData_32 (filter_32), .oData_33 (filter_33)
);
排序模块
分析上述步骤,每一步都是对3个数进行排序,所以需要一个模块来完成这个任务,该模块消耗1时钟周期。
module sort_3(
input clk,
input rst_n,
input [7:0] data1, data2, data3,
output reg [7:0] max, mid, min
);
always @(pos