FPGA-均值滤波算法的实现

简介: FPGA-均值滤波算法的实现

1.  背景知识


      均值滤波是典型的线性滤波算法,它是指在图像上对目标像素给一个模板,该模板包括了其周围的临近像素(以目标像素为中心的周围 8 个像素,构成一个滤波模板,即去掉目了其周围的临近像素(以目标像素为中心的周围 8 个像素,构成一个滤波模板,即去掉目标像素本身),再用模板中的全体像素的平均值来代替原来像素值。

均值滤波也称为线性滤波,其采用的主要方法为邻域平均法。线性滤波的基本原理是用均值代替原图像中的各个像素值,即对待处理的当前像素点(x,y),选择一个模板,该模

板由其近邻的若干像素组成,求模板中所有像素的均值,再把该均值赋予当前像素点(x,y),作为处理后图像在该点上的灰度 g(x,y),即 g(x,y)=1/m ∑f(x,y) m 为该模板中包含当前像素在内的像素总个数。

均值滤波本身存在着固有的缺陷,即它不能很好地保护图像细节,在图像去噪的同时也

破坏了图像的细节部分,从而使图像变得模糊,不能很好地去除噪声点。

2. FPGA  的均值滤波算法实现步骤


(x-1,y-1)  (x,y-1)  (x+1,y-1)

(x-1,y)       (x,y)      (x+1,y)

(x-1,y+1) (x,y+1) (x+1,y+1)

3x3 像素坐标位置

中心点(x,y)为均值滤波将要处理的位置,

f(x,y)表示(x,y)点的像素值,

g(x,y)表示(x,y)点经过均值处理后的值。

均值滤波公式表示如下:

g(x,y)=1/8*(f(x-1,y-1)+f(x,y-1)+f(x+1,y-1)

+f(x-1,y)+f(x+1,y)+

f(x-1,y+1)+f(x,y+1)+f(x+1,y+1))------------------------------(1)

由(1)式我们看出(x,y)点的 3x3 像素点的均值等于其周围邻域的八个点的像素值之和

除以 8。

FPGA 实现步骤:

1>形成 3x3 矩阵像素

2>求周围邻域八个点的像素值之和

3>将结果右移三位(相当于除以 8)得到结果。

`timescale1ns/1ps////Company: 
//Engineer: 
////CreateDate: 2019/05/0618:31:28//DesignName: 
//ModuleName: ram_3x3_8bit//ProjectName: 
//TargetDevices: 
//ToolVersions: 
//Description: 
////Dependencies: 
////Revision:
//Revision0.01-FileCreated//AdditionalComments:
////moduleram_3x3_8bit(
clk,                        
rst_n,                          
per_clken,
per_img,
matrix_clken,   
matrix_p11,                     
matrix_p12,                     
matrix_p13, 
matrix_p21,                     
matrix_p22,                     
matrix_p23,                     
matrix_p31,                     
matrix_p32,                     
matrix_p33    );
inputclk;                        
inputrst_n;  
inputper_clken;//PreparedImagedataoutput/captureenableclockinput           [7:0]   per_img;//PreparedImagebrightnessinputoutputmatrix_clken;//PreparedImagedataoutput/captureenableclockoutputreg     [7:0]   matrix_p11;                     
outputreg     [7:0]   matrix_p12;                     
outputreg     [7:0]   matrix_p13; //3X3Matrixoutputoutputreg     [7:0]   matrix_p21;                     
outputreg     [7:0]   matrix_p22;                     
outputreg     [7:0]   matrix_p23;                     
outputreg     [7:0]   matrix_p31;                     
outputreg     [7:0]   matrix_p32;                     
outputreg     [7:0]   matrix_p33;
wire    [7:0]   row1_data;
wire    [7:0]   row2_data;
reg     [7:0]   row3_data;
always@(posedgeclkornegedgerst_n)beginif(rst_n==1'b0)beginrow3_data<=1'b0;endelseif(per_clken==1'b1)beginrow3_data<=per_img;
endelsebeginrow3_data<=row3_data;
endendwireshift_clk_en=per_clken;
c_shift_ram_0uut1_Shift_RAM(
      .D(row3_data),        //inputwire [7 : 0] D      .CLK(shift_clk_en),    //inputwireCLK      .SCLR(~rst_n),  //inputwireSCLR      .Q(row2_data)        //outputwire [7 : 0] Q    );
c_shift_ram_0uut2_Shift_RAM(
      .D(row2_data),        //inputwire [7 : 0] D      .CLK(shift_clk_en),    //inputwireCLK      .SCLR(~rst_n),  //inputwireSCLR      .Q(row1_data)        //outputwire [7 : 0] Q    );
//每个像素使能延时三个时钟周期delay3clkreg     [1:0]   per_clken_r;
always@(posedgeclkornegedgerst_n)beginif(rst_n==1'b0)beginper_clken_r<=1'b0;endelsebeginper_clken_r<= {per_clken_r[0], per_clken}; 
endendwireread_clken=per_clken_r[0];
assignmatrix_clken=per_clken_r[1];  
always@(posedgeclkornegedgerst_n)beginif(rst_n==1'b0)begin            {matrix_p11, matrix_p12, matrix_p13} <=1'b0;            {matrix_p21, matrix_p22, matrix_p23} <=1'b0;            {matrix_p31, matrix_p32, matrix_p33} <=1'b0;endelseif(read_clken==1'b1)begin            {matrix_p11, matrix_p12, matrix_p13} <= {matrix_p12, matrix_p13, row1_data};
            {matrix_p21, matrix_p22, matrix_p23} <= {matrix_p22, matrix_p23, row2_data}; 
            {matrix_p31, matrix_p32, matrix_p33} <= {matrix_p32, matrix_p33, row3_data}; 
endelsebegin            {matrix_p11, matrix_p12, matrix_p13} <= {matrix_p11, matrix_p12, matrix_p13};
            {matrix_p21, matrix_p22, matrix_p23} <= {matrix_p21, matrix_p22, matrix_p23};
            {matrix_p31, matrix_p32, matrix_p33} <= {matrix_p31, matrix_p32, matrix_p33};
endendendmodule
目录
相关文章
|
2月前
|
监控 算法 数据安全/隐私保护
基于三帧差算法的运动目标检测系统FPGA实现,包含testbench和MATLAB辅助验证程序
本项目展示了基于FPGA与MATLAB实现的三帧差算法运动目标检测。使用Vivado 2019.2和MATLAB 2022a开发环境,通过对比连续三帧图像的像素值变化,有效识别运动区域。项目包括完整无水印的运行效果预览、详细中文注释的代码及操作步骤视频,适合学习和研究。
|
7月前
|
算法 异构计算
m基于FPGA的MPPT最大功率跟踪算法verilog实现,包含testbench
该内容包括三部分:1) 展示了Vivado 2019.2和Matlab中关于某种算法的仿真结果图像,可能与太阳能光伏系统的最大功率点跟踪(MPPT)相关。2) 简述了MPPT中的爬山法原理,通过调整光伏电池工作点以找到最大功率输出。3) 提供了一个Verilog程序模块`MPPT_test_tops`,用于测试MPPT算法,其中包含`UI_test`和`MPPT_module_U`两个子模块,处理光伏电流和电压信号。
70 1
|
5月前
|
算法 异构计算
FPGA强化(10):基于Sobel算法的边缘检测(二)
FPGA强化(10):基于Sobel算法的边缘检测(二)
67 0
|
5月前
|
算法 异构计算
FPGA强化(10):基于Sobel算法的边缘检测(一)
FPGA强化(10):基于Sobel算法的边缘检测
37 0
|
7月前
|
算法 TensorFlow 算法框架/工具
基于直方图的图像阈值计算和分割算法FPGA实现,包含tb测试文件和MATLAB辅助验证
这是一个关于图像处理的算法实现摘要,主要包括四部分:展示了四张算法运行的效果图;提到了使用的软件版本为VIVADO 2019.2和matlab 2022a;介绍了算法理论,即基于直方图的图像阈值分割,通过灰度直方图分布选取阈值来区分图像区域;并提供了部分Verilog代码,该代码读取图像数据,进行处理,并输出结果到&quot;result.txt&quot;以供MATLAB显示图像分割效果。
|
7月前
|
算法 计算机视觉 异构计算
基于直方图相似性的图像分类算法FPGA实现,包括tb测试文件和MATLAB辅助验证
该内容包含了一段关于图像处理算法的摘要,主要包括: 1. 展示了MATLAB和FPGA的测试结果图像,显示了图像读取完成的标志和相似性指标,其中图1与图2有较强相似性,图1与图3相似性较弱。 2. 算法使用的是vivado 2019.2和matlab 2022A版本。 3. 算法原理涉及图像直方图统计和直方图相似性度量,通过计算直方图的差异来衡量图像相似度,FPGA实现包括图像采集、直方图计算、比较和分类决策步骤。 4. 提供了一个部分核心Verilog程序,用于读取图像数据并在FPGA上进行直方图相似性计算。
|
7月前
|
存储 算法 算法框架/工具
基于HSV色度空间的图像深度信息提取算法FPGA实现,包含testbench和MATLAB辅助验证程序
该文档介绍了在一个FPGA项目中使用HSV色彩模型提取图像深度信息的过程。通过将RGB图像转换为HSV,然后利用明度与深度的非线性映射估计深度。软件版本为Vivado 2019.2和MATLAB 2022a。算法在MATLAB中进行了对比测试,并在FPGA上实现了优化,包括流水线并行处理和查找表技术。提供的Verilog代码段展示了RGB到灰度的转换。实验结果和核心程序的图片未显示。
|
2天前
|
算法 异构计算
基于FPGA的4ASK调制解调系统,包含testbench,高斯信道模块,误码率统计模块,可以设置不同SNR
本文介绍了基于FPGA的4-ASK调制解调系统的算法仿真效果、理论基础及Verilog核心程序。仿真在Vivado2019.2环境下进行,分别测试了SNR为20dB、15dB、10dB时的性能。理论部分概述了4-ASK的工作原理,包括调制、解调过程及其数学模型。Verilog代码实现了4-ASK调制器、加性高斯白噪声(AWGN)信道模拟、解调器及误码率计算模块。
19 8
|
18天前
|
算法 数据安全/隐私保护 异构计算
基于FPGA的1024QAM基带通信系统,包含testbench,高斯信道模块,误码率统计模块,可以设置不同SNR
本文介绍了基于FPGA的1024QAM调制解调系统的仿真与实现。通过Vivado 2019.2进行仿真,分别在SNR=40dB和35dB下验证了算法效果,并将数据导入Matlab生成星座图。1024QAM调制将10比特映射到复数平面上的1024个星座点之一,适用于高数据传输速率的应用。系统包含数据接口、串并转换、星座映射、调制器、解调器等模块。Verilog核心程序实现了调制、加噪声信道和解调过程,并统计误码率。
37 1
|
2月前
|
算法 数据安全/隐私保护 异构计算
基于FPGA的64QAM基带通信系统,包含testbench,高斯信道模块,误码率统计模块,可以设置不同SNR
本文介绍了基于FPGA的64QAM调制解调通信系统的设计与实现,包括信号生成、调制、解调和误码率测试。系统在Vivado 2019.2中进行了仿真,通过设置不同SNR值(15、20、25)验证了系统的性能,并展示了相应的星座图。核心程序使用Verilog语言编写,加入了信道噪声模块和误码率统计功能,提升了仿真效率。
49 4

热门文章

最新文章