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
目录
相关文章
|
3月前
|
监控 算法 数据安全/隐私保护
基于三帧差算法的运动目标检测系统FPGA实现,包含testbench和MATLAB辅助验证程序
本项目展示了基于FPGA与MATLAB实现的三帧差算法运动目标检测。使用Vivado 2019.2和MATLAB 2022a开发环境,通过对比连续三帧图像的像素值变化,有效识别运动区域。项目包括完整无水印的运行效果预览、详细中文注释的代码及操作步骤视频,适合学习和研究。
|
8月前
|
算法 异构计算
m基于FPGA的MPPT最大功率跟踪算法verilog实现,包含testbench
该内容包括三部分:1) 展示了Vivado 2019.2和Matlab中关于某种算法的仿真结果图像,可能与太阳能光伏系统的最大功率点跟踪(MPPT)相关。2) 简述了MPPT中的爬山法原理,通过调整光伏电池工作点以找到最大功率输出。3) 提供了一个Verilog程序模块`MPPT_test_tops`,用于测试MPPT算法,其中包含`UI_test`和`MPPT_module_U`两个子模块,处理光伏电流和电压信号。
83 1
|
6月前
|
算法 异构计算
FPGA强化(10):基于Sobel算法的边缘检测(二)
FPGA强化(10):基于Sobel算法的边缘检测(二)
106 0
|
6月前
|
算法 异构计算
FPGA强化(10):基于Sobel算法的边缘检测(一)
FPGA强化(10):基于Sobel算法的边缘检测
48 0
|
8月前
|
算法 TensorFlow 算法框架/工具
基于直方图的图像阈值计算和分割算法FPGA实现,包含tb测试文件和MATLAB辅助验证
这是一个关于图像处理的算法实现摘要,主要包括四部分:展示了四张算法运行的效果图;提到了使用的软件版本为VIVADO 2019.2和matlab 2022a;介绍了算法理论,即基于直方图的图像阈值分割,通过灰度直方图分布选取阈值来区分图像区域;并提供了部分Verilog代码,该代码读取图像数据,进行处理,并输出结果到&quot;result.txt&quot;以供MATLAB显示图像分割效果。
|
8月前
|
算法 计算机视觉 异构计算
基于直方图相似性的图像分类算法FPGA实现,包括tb测试文件和MATLAB辅助验证
该内容包含了一段关于图像处理算法的摘要,主要包括: 1. 展示了MATLAB和FPGA的测试结果图像,显示了图像读取完成的标志和相似性指标,其中图1与图2有较强相似性,图1与图3相似性较弱。 2. 算法使用的是vivado 2019.2和matlab 2022A版本。 3. 算法原理涉及图像直方图统计和直方图相似性度量,通过计算直方图的差异来衡量图像相似度,FPGA实现包括图像采集、直方图计算、比较和分类决策步骤。 4. 提供了一个部分核心Verilog程序,用于读取图像数据并在FPGA上进行直方图相似性计算。
|
8月前
|
存储 算法 算法框架/工具
基于HSV色度空间的图像深度信息提取算法FPGA实现,包含testbench和MATLAB辅助验证程序
该文档介绍了在一个FPGA项目中使用HSV色彩模型提取图像深度信息的过程。通过将RGB图像转换为HSV,然后利用明度与深度的非线性映射估计深度。软件版本为Vivado 2019.2和MATLAB 2022a。算法在MATLAB中进行了对比测试,并在FPGA上实现了优化,包括流水线并行处理和查找表技术。提供的Verilog代码段展示了RGB到灰度的转换。实验结果和核心程序的图片未显示。
|
13天前
|
机器学习/深度学习 算法
基于改进遗传优化的BP神经网络金融序列预测算法matlab仿真
本项目基于改进遗传优化的BP神经网络进行金融序列预测,使用MATLAB2022A实现。通过对比BP神经网络、遗传优化BP神经网络及改进遗传优化BP神经网络,展示了三者的误差和预测曲线差异。核心程序结合遗传算法(GA)与BP神经网络,利用GA优化BP网络的初始权重和阈值,提高预测精度。GA通过选择、交叉、变异操作迭代优化,防止局部收敛,增强模型对金融市场复杂性和不确定性的适应能力。
146 80
|
1天前
|
机器学习/深度学习 数据采集 算法
基于GA遗传优化的CNN-GRU-SAM网络时间序列回归预测算法matlab仿真
本项目基于MATLAB2022a实现时间序列预测,采用CNN-GRU-SAM网络结构。卷积层提取局部特征,GRU层处理长期依赖,自注意力机制捕捉全局特征。完整代码含中文注释和操作视频,运行效果无水印展示。算法通过数据归一化、种群初始化、适应度计算、个体更新等步骤优化网络参数,最终输出预测结果。适用于金融市场、气象预报等领域。
基于GA遗传优化的CNN-GRU-SAM网络时间序列回归预测算法matlab仿真
|
1天前
|
算法
基于龙格库塔算法的锅炉单相受热管建模与matlab数值仿真
本设计基于龙格库塔算法对锅炉单相受热管进行建模与MATLAB数值仿真,简化为喷水减温器和末级过热器组合,考虑均匀传热及静态烟气处理。使用MATLAB2022A版本运行,展示自编与内置四阶龙格库塔法的精度对比及误差分析。模型涉及热传递和流体动力学原理,适用于优化锅炉效率。

热门文章

最新文章