文章目录
- 一、高斯滤波算法
- 二、matlab高斯滤波
- 三、FPGA实现高斯滤波
-
- 3.1 3*3窗口生成模块
- 3.2 高斯滤波模块
- 四、modeslim仿真
- 五、效果对比
- 六、高斯模板的计算
基于 FPGA中值滤波,本文实现高斯滤波。
一、高斯滤波算法 1、高斯滤波原理
高斯滤波也是一种线性平滑滤波,高斯滤波的输出是待处理像素邻域内像素的加权平均灰度值,同时离中心越近的像素权重越高。因此,高斯滤波比均值滤波的平滑效果更柔和,有着保留边缘的好处,克服了边界效应。由于高斯滤波的平滑力度不如均值滤波,因此其保留细节的能力也比均值滤波更好。
基本操作:首先产生一个模板(33窗口),用该模板扫描图中的每一个像素,用33邻域内像素的加权平均灰度值来替换中心像素点的值。2、高斯滤波函数
二维高斯函数如下,σ为标准差,决定高斯滤波后图像的平滑程度。
文章图片
根据σ计算高斯模板,σ = 0.8,取整后,通常3*3的高斯模板如下:
文章图片
3、应用
- 消除高斯噪声
- 用于SIFT特征点提取处的构建高斯金字塔等……
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,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:移位操作
文章图片
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实现高斯滤波:
文章图片
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的高斯模板:
文章图片
我们第一节给出的矩阵前面乘以了1/16,目的是归一化处理,保证让矩阵内的数据相加为1,这样在处理的时候就能免去亮度的影响。
推荐阅读
- matlab|FPGA实现sobel边缘检测并Modelsim仿真,与MATLAB实现效果对比
- 基于matlab因子指标赋权(主成分分析+熵值法+博弈论的组合赋权法)
- 数电|病房呼叫电路multisim仿真
- matlab|【转】电子毕业设计题目
- verilog|Verilog 四层电梯设计
- ★MATLAB算法仿真经验|【眼底检测】视网膜动静脉血管检测和特征计算matlab仿真
- python与matlab一些常用函数互转
- MATLAB SVM寻找最佳参数 c g
- matlab极值法绘制分叉图