您当前的位置: 首页 >  算法

耐心的小黑

暂无认证

  • 1浏览

    0关注

    323博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

FPGA丨均值滤波算法实现

耐心的小黑 发布时间:2021-03-28 10:42:42 ,浏览量:1

参考:小梅哥的《FPGA系统设计与验证实战指南》

一、算法介绍

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

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

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

FPGA的均值滤波算法实现步骤: 在这里插入图片描述 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))

由上式我们看出(x,y)点的3x3像素点的均值等于其周围邻域的八个点的像素值之和除以8。

1>形成3x3矩阵像素

2>求周围邻域八个点的像素值之和

3>将结果右移三位(相当于除以8)得到结果。

二、程序设计

关于如何形成3*3的像素矩阵,参考另一篇文章:FPGA丨设计行缓存(linebuffer)生成像素矩阵

module  mean_filter_3x3(
	 input clk, //pixel clk
	 input rst_n,
	 
	 input [15:0]data_in, //16 bit 灰度 pixel 
	 input data_in_en,
	 
	 output reg [15:0] data_out,
	 output reg data_out_en
);
//------------------------------------
// 三行像素缓存
//----------------------------------- 
wire [15:0] line0;
wire [15:0] line1;
wire [15:0] line2;
//-----------------------------------------
// 3x3 像素矩阵中的像素点
//-----------------------------------------
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;

wire   mat_flag; 
reg    mat_flag_1; 
reg    mat_flag_2; 
reg    mat_flag_3; 
reg    mat_flag_4; 


always @(posedge clk)begin
        mat_flag_1                      
关注
打赏
1640088279
查看更多评论
0.0420s