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

这里就不啰嗦了,重点是后面的高斯滤波和双边滤波的讲解。

更多推荐