FPGA丨高斯滤波算法实现
参考:小梅哥的《FPGA系统设计与验证实战指南》
一、算法介绍
高斯滤波是一种线性平滑滤波,适用于消除高斯噪声,广泛应用于图像处理的减噪过程。通俗的讲,高斯滤波就是对整幅图像进行加权平均的过程,每一个像素点的值,都由其本身和邻域内的其他像素值经过加权平均后得到。高斯滤波的具体操作是:用一个模板(或称卷积、掩模)扫描图像中的每一个像素,用模板确定的邻域内像素的加权平均灰度值去替代模板中心像素点的值。
高斯滤波后图像被平滑的程度取决于标准差。它的输出是临域像素的加权平均,同时离中心越近的像素权重越高。因此,相对于均值滤波(mean filter)它的平滑效果更柔和,而且边缘保留的也更好。
高斯滤波被用作为平滑滤波器的本质原因是因为它是一个低通滤波器,而且大部份基于卷积平滑滤波器都是低通滤波器。
GAUSS 滤波算法克服了边界效应,因而滤波后的图像较好。
高斯滤波算法实现步骤:
f(x,y)表示(x,y)点的像素值;
g(x,y)表示(x,y)点经过高斯滤波处理后的值;
用模板确定的邻域内像素的加权平均灰度值去替代模板中心像素点的值:
g(x,y)=(1/16)* (f(x-1,y-1)+2f(x,y-1)+f(x+1,y-1)+2f(x-1,y)+4f(x,y) + 2f(x+1,y)+f(x-1,y+1)+2f(x,y+1)+f(x+1,y+1))
二、程序设计
关于如何形成3*3的像素矩阵,参考另一篇文章:FPGA丨设计行缓存(linebuffer)生成像素矩阵
module gaussian_filter_3x3(input clk, //pixel clkinput 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)beginmat_flag_1 <= mat_flag; mat_flag_2 <= mat_flag_1; mat_flag_3 <= mat_flag_2; mat_flag_4 <= mat_flag_3;
end//---------------------------------------------
// 获取3*3的图像矩阵
//---------------------------------------------
matrix_3x3 matrix_3x3_inst(.clk (clk),.rst_n(rst_n),.din (data_in),.valid_in(data_in_en),.dout(),.dout_r0(line0),.dout_r1(line1),.dout_r2(line2),.mat_flag(mat_flag)
);
//--------------------------------------------------
// Form an image matrix of three multiplied by three
//--------------------------------------------------
always @(posedge clk or negedge rst_n) beginif(!rst_n) beginline0_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;endelse 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; end
end//--------------------------------------------------------------------------
// 计算最终结果
//--------------------------------------------------------------------------
always @(posedge clk or negedge rst_n) beginif(!rst_n)data_out <= 16'b0;else if(data_in_en)data_out <= (line0_data0 + line0_data1*2 + line0_data2 + line1_data0*2 + line1_data1*4 +line1_data2*2 + line2_data0 + line2_data1*2 + line2_data2)>>4;else ;
endalways @(posedge clk or negedge rst_n)if(rst_n == 1'b0)data_out_en <= 1'b0;else if(mat_flag_3 == 1'b1 && mat_flag_4 == 1'b1) data_out_en <= 1'b1;elsedata_out_en <= 1'b0;endmodule
三、仿真
`timescale 1ns/1ps`define CLK_PERIOD 20//50MHZmodule tb ();
reg clk;
reg [15:0] din;
reg rst_n;
reg valid_in;
//wires
wire [15:0] data_out;
wire data_out_en;gaussian_filter_3x3 u_gaussian_filter_3x3 (.clk ( clk ),.rst_n ( rst_n ),.data_in ( din [15:0] ),.data_in_en ( valid_in ),.data_out ( data_out [15:0] ),.data_out_en ( data_out_en )
);
initial beginclk = 0;rst_n = 0;valid_in = 0;#(`CLK_PERIOD * 10);rst_n=1;#(`CLK_PERIOD*10);valid_in = 1;#(`CLK_PERIOD*480*5);valid_in = 0;#(`CLK_PERIOD*20);$stop;
endalways #(`CLK_PERIOD/2) clk = ~clk;always @ (posedge clk or negedge rst_n)beginif(!rst_n)din <= 0;else if(din == 479)din <= 0;else if (valid_in == 1'b1)din <= din + 1'b1;
endendmodule
可以看出,在mat_flag
拉高的三个clk后第一个有效像素矩阵形成,由于计算逻辑在always中又将计算结果延迟了一个clk,所以一个clk后计算结果才出现,也即输出有效。这里的data_out_en
会在数据有效时拉高,因为我把data_out_en
定义成了reg,所以这里滞后了一个clk。
需要注意的是:
上述代码的输入图像数据默认是灰度图像的数据,数据位宽为16。关于如何得到灰度图,可以参考另一篇文章:
FPGA丨RGB转Gray算法实现(rgb2ycbcr)
FPGA丨高斯滤波算法实现相关推荐
- 图像处理:高斯滤波算法
目录 前言 概念介绍 基本原理 卷积核的大小 卷积核的形状和权重比 卷积核的归一化 结论 Opencv实现高斯滤波 Python手写实现高斯滤波 参考文章 前言 在此之前,我曾在此篇中推导过图像处理: ...
- 高斯滤波详解 python实现高斯滤波
一. 高斯滤波 高斯滤波是一种线性平滑滤波器,对于服从正态分布的噪声有很好的抑制作用.在实际场景中,我们通常会假定图像包含的噪声为高斯白噪声,所以在许多实际应用的预处理部分,都会采用高斯滤波抑制噪声. ...
- NR基础篇上——均值滤波、高斯滤波、双边滤波、NLM
人类的世界就是一个信号传输的世界,所以噪声无处不在,图像作为一种信号传输的方式当然也无法幸免.为了尽量减少噪声对图像质量的影响,还原物体的本来状态就提出了一系列降噪的方法,本文就简单介绍几种常见的降噪 ...
- c语言 算术平均滤波法_基本C语言滤波算法
11种软件滤波方法的示例程序 假定从8位AD中读取数据(如果是更高位的AD可定义数据类型为int),子程序为get_ad(); 1.限副滤波 /* A值可根据实际情况调整 value为有效值,new ...
- 卷积滤波 英文_图像的卷积(滤波)运算(二)——高斯滤波
1.高斯滤波原理 根据数学知识,一维高斯函数可以描述为: 在图像处理中,选定X方向上长度为3的窗口,令δ=1,中心坐标为1,由上述公式,其卷积核(Xa,X,Xb)可以如下计算: Xa = exp(-1 ...
- 高斯滤波知识点总结——KF、EKF、UKF以及IF、EIF等
高斯滤波知识点总结--KF.EKF.UKF以及IF.EIF等 1 引言 本文是我在学习<Probabilistic Robotics >这本书中第三章--高斯滤波过程中的一些知识总结.本文 ...
- 数字图像处理之高斯滤波加速优化
在上一篇文章中,我们讲了高斯滤波以及分离高斯滤波的原理与C++实现.本文将在此基础上,分别详细讲解使用SSE指令和CUDA来对分离高斯滤波算法的优化加速. 一.SSE指令优化 我们知道,SSE指令优化 ...
- 图像降噪算法——中值滤波/均值滤波/高斯滤波/双边滤波
图像降噪算法--中值滤波/均值滤波/高斯滤波/双边滤波 图像降噪算法--中值滤波/均值滤波/高斯滤波/双边滤波 1. 基本原理 2. C++代码实现 3. 结论 图像降噪算法--中值滤波/均值滤波/高 ...
- 图像处理:推导五种滤波算法(均值、中值、高斯、双边、引导)
目录 概论 算法原理 1.均值滤波 2.中值滤波 3.高斯滤波 4.双边滤波 5.引导滤波 手写代码 Opencv代码实现 最后的总结 参考文章 概论 本来打算是分开推导的,但我觉得还是整个合集吧,避 ...
最新文章
- 【每日一算法】移除元素
- matlab 显示3d频谱_matlab 关于频谱分析程序集锦
- spring 通过编程来获取属性文件
- 成功解决 This graphics driver could not find compatible graphics hardware. You maycontinue installation,
- 中石油训练赛 - Match Matching(完全背包)
- java课程设计实验报告_javaweb课程设计实验报告
- (计算机组成原理)第三章存储系统-第六节2:Cache和主存的映射方式(全相联映射、直接映射和组相连映射)
- 前端自适应----单位rem
- H5实现拍照及相册图片上传
- 利用服务端session保存用户信息
- buuctf-变异凯撒
- matlab代码运行教程(如何运行下载的代码)
- matlab三元一次方程组的解包含未知数,用matlab解三元一次方程组_matlab解高阶方程_matlab二分法求方程的近似解...
- [MRI]核磁共振头线圈和体线圈
- python画反比例函数_拟合一个反比例函数
- 涨跌的例题用C语言编辑,基于LSTM的股票涨跌分析-pytorch
- MySQL 5.7 中文全文检索
- win2019服务器版游戏性能,微软win10发布2019年03累积更新,修复游戏和鼠标性能卡顿等问题...
- Java EasyWord导出word文档
- ClickOnce 通过URL传递参数