fpga开发|FPGA高斯滤波实现并Modelsim仿真,与MATLAB高斯滤波进行对比


文章目录

  • 一、高斯滤波算法
  • 二、matlab高斯滤波
  • 三、FPGA实现高斯滤波
    • 3.1 3*3窗口生成模块
    • 3.2 高斯滤波模块
  • 四、modeslim仿真
  • 五、效果对比
  • 六、高斯模板的计算

基于 FPGA中值滤波,本文实现高斯滤波。
一、高斯滤波算法 1、高斯滤波原理
高斯滤波也是一种线性平滑滤波,高斯滤波的输出是待处理像素邻域内像素的加权平均灰度值,同时离中心越近的像素权重越高。因此,高斯滤波比均值滤波的平滑效果更柔和,有着保留边缘的好处,克服了边界效应。由于高斯滤波的平滑力度不如均值滤波,因此其保留细节的能力也比均值滤波更好。
基本操作:首先产生一个模板(33窗口),用该模板扫描图中的每一个像素,用33邻域内像素的加权平均灰度值来替换中心像素点的值。
2、高斯滤波函数
二维高斯函数如下,σ为标准差,决定高斯滤波后图像的平滑程度。
fpga开发|FPGA高斯滤波实现并Modelsim仿真,与MATLAB高斯滤波进行对比
文章图片

根据σ计算高斯模板,σ = 0.8,取整后,通常3*3的高斯模板如下:
fpga开发|FPGA高斯滤波实现并Modelsim仿真,与MATLAB高斯滤波进行对比
文章图片

3、应用
  • 消除高斯噪声
  • 用于SIFT特征点提取处的构建高斯金字塔等……
二、matlab高斯滤波
clc; clear all; close all; RGB= imread('flower.bmp'); %读取图片 g=imnoise (RGB,'gaussian',0.2); %添加高斯噪声gray = rgb2gray(g); %灰度图 Gauss_3x3 = fspecial('gaussian',3,0.8); %sigma=0.8的3*3高斯模板 Gauss = imfilter(gray, Gauss_3x3); %高斯滤波subplot(2,1,1); imshow(gray); title('灰度图'); subplot(2,1,2); imshow(Gauss); title('高斯滤波'); imwrite (gray,'含高斯噪声的灰度图.bmp'); imwrite (Gauss,'高斯滤波.bmp');

运行结果:
fpga开发|FPGA高斯滤波实现并Modelsim仿真,与MATLAB高斯滤波进行对比
文章图片

三、FPGA实现高斯滤波 fpga开发|FPGA高斯滤波实现并Modelsim仿真,与MATLAB高斯滤波进行对比
文章图片

3.1 3*3窗口生成模块 和之前相同生成3*3窗口,作为高斯卷积模板
module filter_3x3( input clk, input rst_n,inputgray_de,input [7:0] iData,outputfilter_de,output reg [7:0] oData_11, oData_12, oData_13, output reg [7:0] oData_21, oData_22, oData_23, output reg [7:0] oData_31, oData_32, oData_33 );

3.2 高斯滤波模块 高斯滤波就是加权平均的结果,同时选用常用3*3模板,并结合流水线技术,将其拆分成四级流水线进行计算。
第一个clk:进行所有乘法并每行相加 g1,g2,g3;
第二个clk:进行所有行的加法 g = g1 + g2 +g3
第三个clk:移位操作
fpga开发|FPGA高斯滤波实现并Modelsim仿真,与MATLAB高斯滤波进行对比
文章图片

verilog代码如下:
module gaussian_filter( inputclk, inputrst_n,inputwireiValid,input[7:0]filter_11,filter_12,filter_13, //生成的3*3窗口数据 input[7:0]filter_21,filter_22,filter_23, input[7:0]filter_31,filter_32,filter_33,outputgaussian_de,//de同步信号outputwire[7:0]gaussian_data// 高斯卷积:加权平均后的值); reg [2:0]de_shift1 ; //乘法所用信号 reg[9:0] g1,g3; reg[10:0] g2; reg[11:0] g; reg[7:0]g_data; //--------------------------------------------------- //高斯滤波三级流水线 //---------------------------------------------------//clk1,进行所有乘法并每行相加always @ (posedge clk or negedge rst_n) if(!rst_n) begin g1 <= 1'b0; g2 <= 1'b0; g3 <= 1'b0; end else begin g1 <= filter_11 + filter_12 * 2+ filter_13; g2 <= filter_21*2 + filter_22 *4+ filter_23 *2 ; g3 <= filter_31 + filter_32 *2+ filter_33; end//clk2,三行得到的值相加,以完成高斯卷积中所有的加法 always @ (posedge clk or negedge rst_n) if(!rst_n) g <= 1'b0; else g <= g1 + g2 +g3; // clk3,移位操作,除以16,右移四位always @(posedge clk or negedge rst_n) begin if(!rst_n) begin g_data <= 1'd0; end else begin g_data <= g[11:4]; end endassigngaussian_data =https://www.it610.com/article/g_data; // 打拍做同步always @(posedge clk ornegedge rst_n) begin if(!rst_n)begin de_shift1<=3'b0; end else begin de_shift1 <= {de_shift1[1:0], iValid}; end endassign gaussian_de= de_shift1[2]; endmodule

四、modeslim仿真 以该矩阵为例进行计算。
fpga开发|FPGA高斯滤波实现并Modelsim仿真,与MATLAB高斯滤波进行对比
文章图片

结果与波形一致,时钟对齐,数据均正确。
fpga开发|FPGA高斯滤波实现并Modelsim仿真,与MATLAB高斯滤波进行对比
文章图片

五、效果对比 含有高斯噪声的原图:
fpga开发|FPGA高斯滤波实现并Modelsim仿真,与MATLAB高斯滤波进行对比
文章图片

FPGA实现高斯滤波:
fpga开发|FPGA高斯滤波实现并Modelsim仿真,与MATLAB高斯滤波进行对比
文章图片

matlab实现高斯滤波:
fpga开发|FPGA高斯滤波实现并Modelsim仿真,与MATLAB高斯滤波进行对比
文章图片

可看到均起到了消除高斯噪声的效果。
完整工程
六、高斯模板的计算 在第一节中我们已知sigma和窗口大小,代入高斯函数的公式即可得到高斯模板。给出matlab计算的方法:
进行不同模板大小计算的时候修改k值。
采用不同尺度sigma的时候,修改sigam2即可。
clear; k=1; row = 2*k+1; %模板长度 col = 2*k+1; sigma2=0.8; %方差 for i=1 : row for j=1 : col fenzi=double((i-k-1)^2+(j-k-1)^2); A(i,j)=exp(-fenzi/(2*sigma2*sigma2))/(2*pi*sigma2*sigma2); end end A%显示小数形式 C=floor(A.*(1/A(1,1))); %左上角化为1

【fpga开发|FPGA高斯滤波实现并Modelsim仿真,与MATLAB高斯滤波进行对比】运行得到sigma = 0.8,模板尺度3*3的高斯模板:
fpga开发|FPGA高斯滤波实现并Modelsim仿真,与MATLAB高斯滤波进行对比
文章图片

我们第一节给出的矩阵前面乘以了1/16,目的是归一化处理,保证让矩阵内的数据相加为1,这样在处理的时候就能免去亮度的影响。

    推荐阅读