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的图像退化算法verilog实现,分别实现横向和纵向运动模糊,包括tb和MATLAB辅助验证
本项目基于FPGA实现图像运动模糊算法,包含横向与纵向模糊处理流程。使用Vivado 2019.2与MATLAB 2022A,通过一维卷积模拟点扩散函数,完成图像退化处理,并可在MATLAB中预览效果。
|
7月前
|
算法 数据安全/隐私保护 计算机视觉
基于FPGA的图像双线性插值算法verilog实现,包括tb测试文件和MATLAB辅助验证
本项目展示了256×256图像通过双线性插值放大至512×512的效果,无水印展示。使用Matlab 2022a和Vivado 2019.2开发,提供完整代码及详细中文注释、操作视频。核心程序实现图像缩放,并在Matlab中验证效果。双线性插值算法通过FPGA高效实现图像缩放,确保质量。
|
6月前
|
算法 数据安全/隐私保护 异构计算
基于LSB最低有效位的音频水印嵌入提取算法FPGA实现,包含testbench和MATLAB对比
本项目展示了一种基于FPGA的音频水印算法,采用LSB(最低有效位)技术实现版权保护与数据追踪功能。使用Vivado2019.2和Matlab2022a开发,完整代码含中文注释及操作视频。算法通过修改音频采样点的最低有效位嵌入水印,人耳难以察觉变化。然而,面对滤波或压缩等攻击时,水印提取可能受影响。该项目运行效果无水印干扰,适合实时应用场景,核心逻辑简单高效,时间复杂度低。
|
算法 异构计算
m基于FPGA的MPPT最大功率跟踪算法verilog实现,包含testbench
该内容包括三部分:1) 展示了Vivado 2019.2和Matlab中关于某种算法的仿真结果图像,可能与太阳能光伏系统的最大功率点跟踪(MPPT)相关。2) 简述了MPPT中的爬山法原理,通过调整光伏电池工作点以找到最大功率输出。3) 提供了一个Verilog程序模块`MPPT_test_tops`,用于测试MPPT算法,其中包含`UI_test`和`MPPT_module_U`两个子模块,处理光伏电流和电压信号。
257 1
|
11月前
|
监控 算法 数据安全/隐私保护
基于三帧差算法的运动目标检测系统FPGA实现,包含testbench和MATLAB辅助验证程序
本项目展示了基于FPGA与MATLAB实现的三帧差算法运动目标检测。使用Vivado 2019.2和MATLAB 2022a开发环境,通过对比连续三帧图像的像素值变化,有效识别运动区域。项目包括完整无水印的运行效果预览、详细中文注释的代码及操作步骤视频,适合学习和研究。
|
算法 异构计算
FPGA强化(10):基于Sobel算法的边缘检测(二)
FPGA强化(10):基于Sobel算法的边缘检测(二)
160 0
|
算法 异构计算
FPGA强化(10):基于Sobel算法的边缘检测(一)
FPGA强化(10):基于Sobel算法的边缘检测
124 0
|
11天前
|
机器学习/深度学习 算法 新能源
【优化调度】基于matlab粒子群算法求解水火电经济调度优化问题研究(Matlab代码实现)
【优化调度】基于matlab粒子群算法求解水火电经济调度优化问题研究(Matlab代码实现)
|
12天前
|
算法 机器人 定位技术
基于机器视觉和Dijkstra算法的平面建筑群地图路线规划matlab仿真
本程序基于机器视觉与Dijkstra算法,实现平面建筑群地图的路径规划。通过MATLAB 2022A读取地图图像,识别障碍物并进行路径搜索,支持鼠标选择起点与终点,最终显示最优路径及长度,适用于智能导航与机器人路径规划场景。
|
13天前
|
机器学习/深度学习 算法 数据安全/隐私保护
基于PSO粒子群优化的XGBoost时间序列预测算法matlab仿真
本程序基于Matlab 2024b实现,结合粒子群优化(PSO)与XGBoost算法,用于时间序列预测。通过PSO优化XGBoost超参数,提升预测精度。程序包含完整注释与操作视频,运行后生成预测效果图及性能评估指标RMSE。

热门文章

最新文章