1、高斯滤波原理
高斯滤波也是一种线性平滑滤波,高斯滤波的输出是待处理像素邻域内像素的加权平均灰度值,同时离中心越近的像素权重越高。因此,高斯滤波比均值滤波的平滑效果更柔和,有着保留边缘的好处,克服了边界效应。由于高斯滤波的平滑力度不如均值滤波,因此其保留细节的能力也比均值滤波更好。
基本操作:首先产生一个模板(33窗口),用该模板扫描图中的每一个像素,用33邻域内像素的加权平均灰度值来替换中心像素点的值。
2、高斯滤波函数
二维高斯函数如下,σ为标准差,决定高斯滤波后图像的平滑程度。
根据σ计算高斯模板,σ = 0.8,取整后,通常3*3的高斯模板如下:
3、应用
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');
和之前相同生成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*3模板,并结合流水线技术,将其拆分成四级流水线进行计算。
第一个clk:进行所有乘法并每行相加 g1,g2,g3;
第二个clk:进行所有行的加法 g = g1 + g2 +g3
第三个clk:移位操作
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
以该矩阵为例进行计算。
结果与波形一致,时钟对齐,数据均正确。
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,这样在处理的时候就能免去亮度的影响。