基于FPGA的灰度图像均值滤波算法的实现

情到浓时终转凉″ 提交于 2021-02-12 04:28:09

基于FPGA的灰度图像均值滤波算法的实现

作者:lee

1. 背景知识

均值滤波是典型的线性滤波算法,它是指在图像上对目标像素给一个模板,该模板包括了其周围的临近像素(以目标像素为中心的周围8个像素,构成一个滤波模板,即去掉目标像素本身),再用模板中的全体像素的平均值来代替原来像素值。

均值滤波也称为线性滤波,其采用的主要方法为邻域平均法。线性滤波的基本原理是用均值代替原图像中的各个像素值,即对待处理的当前像素点(xy),选择一个模板,该模板由其近邻的若干像素组成,求模板中所有像素的均值,再把该均值赋予当前像素点(xy),作为处理后图像在该点上的灰度gxy),即gxy=1/m fxym为该模板中包含当前像素在内的像素总个数。

均值滤波本身存在着固有的缺陷,即它不能很好地保护图像细节,在图像去噪的同时也破坏了图像的细节部分,从而使图像变得模糊,不能很好地去除噪声点。

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:       137194782@qq.com

微信公众号: 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/

 

 


本文分享自微信公众号 - FPGA开源工作室(leezym0317)。
如有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!