前言
介绍在fpga中实现3×3矩阵均值滤波
一、均值滤波是什么?
均值滤波主要为了去除椒盐噪声
5×5矩阵实例
对矩阵内像素进行相加求均值 放在矩阵中心作为新矩阵
二、实现流程
使用两个fifo进行流水线处理 缓存两行数据 fifo先进先出 第一行先缓存 进入第一个fifo 缓存完之后 进入第二个fifo
等到第三行数据进来之后 进入矩阵寄存器进行缓存求和操作
矩阵部分实现代码
always@(posedge clk)
if(!rst_n)
begin
{matrix11, matrix12, matrix13} <= 24'd0;
{matrix21, matrix22, matrix23} <= 24'd0;
{matrix31, matrix32, matrix33} <= 24'd0;
end
else if(data_de==1'b1)
begin
{matrix11, matrix12, matrix13} <= {matrix12, matrix13, row1_data};
{matrix21, matrix22, matrix23} <= {matrix22, matrix23, row2_data};
{matrix31, matrix32, matrix33} <= {matrix32, matrix33, row3_data};
end
else
begin
{matrix11, matrix12, matrix13} <= 24'd0;
{matrix21, matrix22, matrix23} <= 24'd0;
{matrix31, matrix32, matrix33} <= 24'd0;
end
fifo部分实现代码
fifo_matrix_buf u1_fifo_matrix_buf (
.rst (~rst_n ),
.wr_clk (clk ),
.rd_clk (clk ),
.din (row3_data ),
.wr_en (wr_en ),
.rd_en (row2_rd ),
.dout (row2_data ),
.full ( ),
.empty (u1_empty )
);
fifo_matrix_buf u2_fifo_matrix_buf (
.rst (~rst_n ),
.wr_clk (clk ),
.rd_clk (clk ),
.din (row2_data ),
.wr_en (wr_en ),
.rd_en (row2_rd ),
.dout (row1_data ),
.full ( ),
.empty (u2_empty )
);
不用shift ram是因为ip相对而言是黑盒子 而且能修改的部分较少
3×3矩阵需要进行除法 除9操作 消耗资源过大 先对1/9扩大 再截位操作 完成除法
部分实现代码
always@(posedge clk or negedge rst_n)
if(!rst_n)
pre_ave_data0 <= 'd0;
else if(matrix_de_r[1]==1'b1)
pre_ave_data0 <= add_line*7282;
else
pre_ave_data0 <= 'd0;
assign pre_ave_data = pre_ave_data0[23:16];
整个流程用img_gen读取灰度txt 然后进行矩阵缓存 均值操作 仿真输出均值后的txt
三、仿真验证
可以看到先缓存两行数据 等到第三行数据进来进行处理
从这个周期开始完成第一个矩阵的构建 随后滑动窗口
matlab验证
总结
使用截位操作完成除法 使用fifo完成矩阵流水线构建