基于fpga的均值滤波
·
1、前言(需要这一部分完整代码的请在评论区上传你的邮箱)
图像在传输、解码等过程中容易产生噪声。因此为了有效去除叠加在图像里面的噪声,又尽可能的减少对原始数据的影响,我们引入滤波算法,当然滤波算法有很多种,这里我们首先介绍均值滤波。
均值滤波顾名思义就是求均值。他的思路也比较简单,就是求矩阵内的均值像素传递给输出像素。核心难点是求出3x3滑动矩阵。如果对这个点不清楚的可以看我前不久写的博客:FPGA sobel边缘检测之双fifo实现滑动矩阵窗口-CSDN博客。
2、实现过程。
这里为了方便就只求灰度图像的滤波,如果是RGB只要对三个通道分别滤波即可。以下是均值滤波的公式:

这里可以发现我们需要对矩阵里面的所有像素求和,然后除以总像素个数。在fpga里面使用除法是非常耗资源的,为了减小资源开销,我们通过转化上述公式(如下公式)将其变为左移和乘法操作。如下:

当然,为了方便,我直接去除中心像素的影响,对中心像素周围八个像素求均值。为什么要这么做呢?8=2^3。因此我只要左移三位即可,简化了点代码。其实是一开始这样写的,后面发现上面的转化思路也就懒得改代码了,感兴趣的可以自己改一下,只要注意位宽即可。哈哈哈。
以下是完整代码:
/*
均值滤波
*/
module rgb_filter
(
input sys_clk ,
input sys_rst_n ,
input rgb_vs ,//场信号
input rgb_hr ,//行信号
input [15:0] rgb_data ,
output reg filter_vs ,//灰度转换数据有效标志
output reg filter_hr ,//灰度转换数据有效标志
output [15:0] filter_data //灰度转换输出
);
wire yuv_vs ;
wire yuv_hr ;
wire [23:0] yuv_data ;
wire matrix_vs ;
wire matrix_hr ;
wire [7:0] matrix_p11 ;
wire [7:0] matrix_p12 ;
wire [7:0] matrix_p13 ;
wire [7:0] matrix_p21 ;
wire [7:0] matrix_p22 ;
wire [7:0] matrix_p23 ;
wire [7:0] matrix_p31 ;
wire [7:0] matrix_p32 ;
wire [7:0] matrix_p33 ;
reg [10:0] sum_data;
always@(posedge sys_clk)
if(!sys_rst_n)
sum_data <= 11'd0;
else
sum_data <= (matrix_p11+matrix_p12+matrix_p13+matrix_p21+matrix_p23+matrix_p31+matrix_p32+matrix_p33)>>3;
always@(posedge sys_clk)
if(!sys_rst_n)begin
filter_vs <=1'b0;
filter_hr <=1'b0;
end
else begin
filter_vs <=matrix_vs;
filter_hr <=matrix_hr;
end
assign filter_data={sum_data[7:3],sum_data[7:2],sum_data[7:3]};
rgb_to_yuv rgb_to_yuv_un
(
.sys_clk (sys_clk ),
.sys_rst_n (sys_rst_n ),
.rgb_vs (rgb_vs ),//场信号
.rgb_hr (rgb_hr ),//行信号
.rgb_data (rgb_data ),
.yuv_vs (yuv_vs ),
.yuv_hr (yuv_hr ),
.yuv_data (yuv_data )
);
matrix_3x3 matrix_3x3_un
(
.sys_clk (sys_clk ),
.sys_rst_n (sys_rst_n ),
.yuv_vs (yuv_vs ),
.yuv_hr (yuv_hr ),
.yuv_data (yuv_data[23:16] ),
.matrix_vs (matrix_vs ),
.matrix_hr (matrix_hr ),
.matrix_p11 (matrix_p11 ),
.matrix_p12 (matrix_p12 ),
.matrix_p13 (matrix_p13 ),
.matrix_p21 (matrix_p21 ),
.matrix_p22 (matrix_p22 ),
.matrix_p23 (matrix_p23 ),
.matrix_p31 (matrix_p31 ),
.matrix_p32 (matrix_p32 ),
.matrix_p33 (matrix_p33 )
);
endmodule
这里就不啰嗦了,重点是后面的高斯滤波和双边滤波的讲解。
更多推荐


所有评论(0)