基于FPGA的灰度图像均值滤波算法的实现
作者:lee神
1. 背景知识
均值滤波是典型的线性滤波算法,它是指在图像上对目标像素给一个模板,该模板包括了其周围的临近像素(以目标像素为中心的周围8个像素,构成一个滤波模板,即去掉目标像素本身),再用模板中的全体像素的平均值来代替原来像素值。
均值滤波也称为线性滤波,其采用的主要方法为邻域平均法。线性滤波的基本原理是用均值代替原图像中的各个像素值,即对待处理的当前像素点(x,y),选择一个模板,该模板由其近邻的若干像素组成,求模板中所有像素的均值,再把该均值赋予当前像素点(x,y),作为处理后图像在该点上的灰度g(x,y),即g(x,y)=1/m ∑f(x,y) m为该模板中包含当前像素在内的像素总个数。
均值滤波本身存在着固有的缺陷,即它不能很好地保护图像细节,在图像去噪的同时也破坏了图像的细节部分,从而使图像变得模糊,不能很好地去除噪声点。
2. FPGA的均值滤波算法实现步骤
(x-1,y-1) |
(x,y-1) |
(x+1,y-1) |
(x-1,y) |
(x,y) |
(x+1,y) |
(x-1,y+1) |
(x,y+1) |
(x+1,y+1) |
f(x,y)表示(x,y)点的像素值。
g(x,y)表示(x,y)点经过均值处理后的值。
g(x,y)=1/8*(f(x-1,y-1)+f(x,y-1)+f(x+1,y-1)
+f(x-1,y)+f(x+1,y)+
f(x-1,y+1)+f(x,y+1)+f(x+1,y+1))------------------------------(1)
由(1)式我们看出(x,y)点的3x3像素点的均值等于其周围邻域的八个点的像素值之和除以8。
FPGA实现步骤
1>形成3x3矩阵像素
2>求周围邻域八个点的像素值之和
3>将结果右移三位(相当于除以8)得到结果。
3.FPGA实现
FPGA平台搭建
方法1:
通过R/G/B通道形成单色通道进入均值滤波器实现灰度图像的均值滤波。
方法2:
首先将RGB图像转换成Ycbcr图像,Y通道进入均值滤波器实现灰度图像的均值滤波
均值滤波源码:
/*
Module name: mean_filter_3x3.v
Description:
Data: 2017/12/22
Engineer: lipu
e-mail: [email protected]
微信公众号: FPGA开源工作室
*/
`timescale 1ns/1ps
module mean_filter_3x3(
input clk,
input rst_n,
input [15:0] data_in,
input data_in_en,
output reg [15:0]data_out,
output data_out_en
);
wire [15:0] line0;
wire [15:0] line1;
wire [15:0] line2;
reg [15:0] line0_data0;
reg [15:0] line0_data1;
reg [15:0] line0_data2;
reg [15:0] line1_data0;
reg [15:0] line1_data1;
reg [15:0] line1_data2;
reg [15:0] line2_data0;
reg [15:0] line2_data1;
reg [15:0] line2_data2;
reg data_out_en0;
reg data_out_en1;
reg data_out_en2;
wire[18:0] result_data;
line3x3 line3x3_inst(
.clken(data_in_en),
.clock(clk),
.shiftin(data_in),
.shiftout(),
.taps0x(line0),
.taps1x(line1),
.taps2x(line2)
);
//----------------------------------------------------
// Form an image matrix of three multiplied by three
//----------------------------------------------------
always @(posedge clk or negedge rst_n) begin
if(!rst_n) begin
line0_data0 <= 16'b0;
line0_data1 <= 16'b0;
line0_data2 <= 16'b0;
line1_data0 <= 16'b0;
line1_data1 <= 16'b0;
line1_data2 <= 16'b0;
line2_data0 <= 16'b0;
line2_data1 <= 16'b0;
line2_data2 <= 16'b0;
data_out_en0 <= 1'b0;
data_out_en1 <= 1'b0;
data_out_en2 <= 1'b0;
end
else if(data_in_en) begin
line0_data0 <= line0;
line0_data1 <= line0_data0;
line0_data2 <= line0_data1;
line1_data0 <= line1;
line1_data1 <= line1_data0;
line1_data2 <= line1_data1;
line2_data0 <= line2;
line2_data1 <= line2_data0;
line2_data2 <= line2_data1;
data_out_en0 <= data_in_en;
data_out_en1 <= data_out_en0;
data_out_en2 <= data_out_en1;
end
End
pa_8 pa_8_inst(
.clken(data_in_en),
.clock(clk),
.data0x(line0),
.data1x(line0_data0),
.data2x(line0_data1),
.data3x(line1),
.data4x(line1_data1),
.data5x(line2),
.data6x(line2_data0),
.data7x(line2_data1),
.result(result_data)
);
always @(posedge clk or negedge rst_n) begin
if(!rst_n)
data_out <= 16'b0;
else if(data_in_en)
data_out <= result_data[18:3];
//data_out <= line2_data1; //test
else ;
end
endmodule
4.仿真过程
将串行数据转换成并行数据
均值滤波结果实现
5.实验结果
原图
灰度图像
经过均值滤波后的灰度图像
结果分析:
从结果效果来看,原始灰度图像的甚多细节被模糊化,实现了灰度图像的均值滤波。
推荐阅读:
基于MATLAB图像处理的中值滤波、均值滤波以及高斯滤波的实现与对比
欢迎大家关注我的微信公众号FPGA开源工作室,以及资源共享QQ群。
最后感谢OpenHW网站对我的支持,欢迎访问:
http://www.openhw.org/