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


基于 FPGA中值滤波,本文实现高斯滤波。


一、高斯滤波算法

1、高斯滤波原理

高斯滤波也是一种线性平滑滤波,高斯滤波的输出是待处理像素邻域内像素的加权平均灰度值,同时离中心越近的像素权重越高。因此,高斯滤波比均值滤波的平滑效果更柔和,有着保留边缘的好处,克服了边界效应。由于高斯滤波的平滑力度不如均值滤波,因此其保留细节的能力也比均值滤波更好。

基本操作:首先产生一个模板(33窗口),用该模板扫描图中的每一个像素,用33邻域内像素的加权平均灰度值来替换中心像素点的值。

2、高斯滤波函数

二维高斯函数如下,σ为标准差,决定高斯滤波后图像的平滑程度。
在这里插入图片描述

根据σ计算高斯模板,σ = 0.8,取整后,通常3*3的高斯模板如下:
在这里插入图片描述

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实现高斯滤波

在这里插入图片描述

3.1 3*3窗口生成模块

和之前相同生成3*3窗口,作为高斯卷积模板

module filter_3x3(
    input clk,
    input rst_n,

    input  gray_de					,
	 
    input [7:0] iData,

    output  filter_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:移位操作

在这里插入图片描述
verilog代码如下:

module gaussian_filter(
    input            clk,
    input            rst_n,
	 
    input   wire		iValid					,

    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,

    output  			 gaussian_de    ,//de同步信号
	 
    output  wire  [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
end
	  
assign 	gaussian_data =  g_data;

// 打拍做同步

    always @(posedge clk or  negedge rst_n) begin
        if(!rst_n)begin
            de_shift1   <=  3'b0;
				
				end
        else begin
            de_shift1 <= {de_shift1[1:0], iValid};
				end
    end

    assign gaussian_de   = de_shift1[2];

  endmodule


四、modeslim仿真

以该矩阵为例进行计算。
在这里插入图片描述
结果与波形一致,时钟对齐,数据均正确。
在这里插入图片描述

五、效果对比

含有高斯噪声的原图:
在这里插入图片描述

FPGA实现高斯滤波:
在这里插入图片描述

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

运行得到sigma = 0.8,模板尺度3*3的高斯模板:
在这里插入图片描述
我们第一节给出的矩阵前面乘以了1/16,目的是归一化处理,保证让矩阵内的数据相加为1,这样在处理的时候就能免去亮度的影响。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Fighting_FPGA

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值