高斯滤波是一种低通平滑滤波,常用于模糊处理和减少噪声信号,其中模糊处理常用于预处理,即在提取目标之前去除图像中的一些细节等,这有利于高通处理。对于二维的数字图像信号,一般通过线性滤波器和非线性滤波器的模糊处理来减少强噪声信号。平滑滤波器就是用滤波掩模确定的邻域内的像素与加权值相卷积后得到的灰度均值来代替每个像素的值,这就很容易使用硬件实现。 GAUSS 滤波算法克服了边界效应,因而滤波后的图像较好。其
gauss滤波的算子为:
gauss滤波的数学公式为:
G(I,j) ={
f(i-1,j-1)+f(i-1,j+1)+f(i+1,j-1)+f(i+1,j+1)+[f(i-1,j)+(i+1,j)+f(i,j-1)+f(i,j+1)]*2+f(i,j)*4}/16 ----------------------------------------------------(1)
以上是FPGA实现高斯滤波的思路:
模块结构结构
FPGA源码:
`timescale 1ns /1ps
modulegauss_filter(
input clk, //
input rst_n,
input [15:0] data_in,
input en_data_in,
output [15:0] data_out,
output en_data_out
);
wire [15:0] line0;
wire [15:0] line1;
wire [15:0] line2;
wire [33:0] acc_result0;
wire [33:0] acc_result1;
wire [33:0] acc_result2;
line3x3line3x3_inst(
.clken(en_data_in),
.clock(clk),
.shiftin(data_in),
.shiftout(),
.taps0x(line0),
.taps1x(line1),
.taps2x(line2)
);
acc acc0_inst(
.aclr3(),
.clock0(clk),
.dataa_0(line0),
.datab_0(16'd1),
.datab_1(16'd2),
.datab_2(16'd1),
.result(acc_result0)
);
acc acc1_inst(
.aclr3(),
.clock0(clk),
.dataa_0(line1),
.datab_0(16'd2),
.datab_1(16'd4),
.datab_2(16'd2),
.result(acc_result1)
);
acc acc2_inst(
.aclr3(),
.clock0(clk),
.dataa_0(line2),
.datab_0(16'd1),
.datab_1(16'd2),
.datab_2(16'd1),
.result(acc_result2)
);
wire [31:0]gauss_data;
assign gauss_data= (acc_result0 + acc_result1 + acc_result2)>>4;
assign data_out =gauss_data[15:0];
endmodule
IP设置:
波形仿真: