FPGA图像处理之高斯滤波仿真篇
作者:lee神
高斯滤波是一种低通平滑滤波,常用于模糊处理和减少噪声信号,其中模糊处理常用于预处理,即在提取目标之前去除图像中的一些细节等,这有利于高通处理。对于二维的数字图像信号,一般通过线性滤波器和非线性滤波器的模糊处理来减少强噪声信号。平滑滤波器就是用滤波掩模确定的邻域内的像素与加权值相卷积后得到的灰度均值来代替每个像素的值,这就很容易使用硬件实现。 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设置:
波形仿真:
不对之处敬请指出
本文分享自微信公众号 - FPGA开源工作室(leezym0317),作者:lee神
原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。
原始发表时间:2017-12-07
本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。
我来说两句