基于FPGA的中值滤波算法的实现

简介: 中值滤波法是一种非线性平滑技术,它将每一像素点的灰度值设置为该点某邻域窗口内的所有像素点灰度值的中值.

1.背景知识

中值滤波法是一种非线性平滑技术,它将每一像素点的灰度值设置为该点某邻域窗口内的所有像素点灰度值的中值.

中值滤波是基于排序统计理论的一种能有效抑制噪声的非线性信号处理技术,中值滤波的基本原理是把数字图像或数字序列中一点的值用该点的一个邻域中各点值的中值代替,让周围的像素值接近的真实值,从而消除孤立的噪声点。方法是用某种结构的二维滑动模板,将板内像素按照像素值的大小进行排序,生成单调上升(或下降)的为二维数据序列。二维中值滤波输出为g(x,y)=med{f(x-k,y-l),(k,l∈W)} ,其中,f(x,y),g(x,y)分别为原始图像和处理后图像。W为二维模板,通常为33,55区域,也可以是不同的的形状,如线状,圆形,十字形,圆环形等。

中值滤波法对消除椒盐噪声非常有效,在光学测量条纹图象的相位分析处理方法中有特殊作用,但在条纹中心分析方法中作用不大.

中值滤波在图像处理中,常用于保护边缘信息,是经典的平滑噪声的方法。

2.中值滤波理论

中值滤波是一种非线性滤波,在数字图像处理中,对于 N X N (N 为奇数) 中值滤波器,可以滤除小于或等于邻域中(N 2- 1)/2 个像素的噪声并且较好地保持图像的边缘[3]。对图像进行中值滤波处理首先要确定一个模板 N ×N ,一般选取 3X 3 或 5 ×5。中问位置的图像数据的表达式为

f (x ,y ) = med{f (x ± k,Y ± Z) , (K≤ (N -1) /2,Z≤ (N-1) /2) }

要得到模板中数据的中间值,首先要将数据按大小排序,然后根据有序的数字序列来找中问值。中值滤波排序的过程有很多成熟的算法,如冒泡排序、二分排序等,大多是基于微机平台的软件算法,而适合硬件平台的排序算法则比较少。

3.FPGA硬件实现方法

L(1,1)

L(1,2)

L(1,3)

L(2,1)

L(2,2)

L(2,3)

L(3,1)

L(3,2)

L(3,3)

如上所示,为一个3x3的图像模板,

第一步:

分别对三行像素进行排序(例:由L11,L12,L13得到L1max,L1mid,L1min);

第二步:

分别对三行像素中的最大,中间和最小分别进行排序(例:由L1max,L2max,L3max得到Lmax_max,Lmax_mid,Lmax_min);

第三步:对最大的最小,中间的中间以及最小的最大进行排序(例:由Lmax_min,Lmid_mid,Lmin_max得到midian);

FPGA的算法实现步骤基本如此。

4.MATLAB的中值滤波演示

源码:

clear all;

clc;

img = imread('flower.bmp');         %读入原始图像

figure,imshow(img);                         %显示原始图像

title('original');

gray_rgb = rgb2gray(img);

figure,imshow(gray_rgb);                         %显示原始图像转化成gray图像

title('grayoriginal');

salt_img = imnoise(img,'salt& pepper',0.02); %对原始图像加入椒盐噪声

figure,imshow(salt_img);                        %显示加入椒盐噪声后的图像 

title('salt& pepper noise');

gray = rgb2gray(salt_img);

figure,imshow(gray);                        %显示加入椒盐噪声的灰度图像 

title('gray');

median_filting_img = medfilt2(gray);  %对加入椒盐噪声的灰度图像进行中值滤波

figure,imshow(median_filting_img);

title('medfiltersalt & pepper noise');

实验结果:

image.png

原始图像

image.png

直接由RGB转换过来的Gray图像

image.png

加入椒盐噪声的彩色图像

image.png

加入椒盐噪声后的gray图像

image.png

中值滤波后的结果

结果分析:中值滤波后的灰度图像明显去除了所有的椒盐噪声,与原始灰度图像相比图像本身被轻微模糊化。

5.FPGA的中值滤波实现

部分源码:

//-------------------------------------

//pipeline data

//-------------------------------------

reg [15:0]line0_data0;

reg [15:0]line0_data1;

reg [15:0]line0_data2;



reg [15:0]line1_data0;

reg [15:0]line1_data1;

reg [15:0]line1_data2;



reg [15:0] line2_data0;

reg [15:0]line2_data1;

reg [15:0]line2_data2;



//--------------------------------------------------------------------------

// Form an imagematrix of three multiplied by three

//--------------------------------------------------------------------------

always @(posedgeclk or negedge rst_n) begin

  if(!rst_n) begin

    line0_data0 <= 16'b0;

        line0_data1 <= 16'b0;

        line0_data2 <= 16'b0;



        line1_data0 <= 16'b0;

        line1_data1 <= 16'b0;

        line1_data2 <= 16'b0;



        line2_data0 <= 16'b0;

        line2_data1 <= 16'b0;

        line2_data2 <= 16'b0;

  end

  else if(data_in_en) begin

    line0_data0 <= line0;

        line0_data1 <= line0_data0;

        line0_data2 <= line0_data1;



        line1_data0 <= line1;

        line1_data1 <= line1_data0;

        line1_data2 <= line1_data1;



        line2_data0 <= line2;

        line2_data1 <= line2_data0;

        line2_data2 <= line2_data1;    

  end

  else ;

end



//------------------------------------------------------------------------------

// middle

//------------------------------------------------------------------------------

always @(posedgeclk or negedge rst_n) begin

  if(!rst_n)

    mid <= 16'd0;

  else if(data_in_en) begin

    if(((max_mid >= mid_mid) &&(max_mid < min_mid)) || ((max_mid >= min_mid) && (max_mid <mid_mid)))

         mid <= max_mid;

        else if(((mid_mid > max_mid) &&(mid_mid < min_mid)) || ((min_mid >= min_mid) && (mid_mid <max_mid)))

         mid <= mid_mid;

        else if(((min_mid > max_mid) &&(min_mid < mid_mid)) || ((min_mid > mid_mid) && (mid_min <max_mid)))

         mid <= min_mid;

  end

  else ;

end

modelsim仿真

image.png

image.png

仿真结果分析:

有modelsim仿真波形来看,三个时钟后得到九个像素点的中间值,源码仿真成功。

实验结果:

image.png

原图

image.png

RGB图像加入椒盐噪声

image.png

中值滤波后

image.png

Gray图像加入椒盐噪声

image.png

中值滤波后

结果分析:

从RGB图像和灰度图像来看,去除了大部分椒盐噪声噪点,部分没有去除的原因在于部分噪点过大,或者相邻太近,被当作中间值显示出来。大家可以试验增加到两次中值滤波的实验结果。

相关文章
|
20天前
|
监控 算法 数据安全/隐私保护
基于三帧差算法的运动目标检测系统FPGA实现,包含testbench和MATLAB辅助验证程序
本项目展示了基于FPGA与MATLAB实现的三帧差算法运动目标检测。使用Vivado 2019.2和MATLAB 2022a开发环境,通过对比连续三帧图像的像素值变化,有效识别运动区域。项目包括完整无水印的运行效果预览、详细中文注释的代码及操作步骤视频,适合学习和研究。
|
6月前
|
算法 异构计算
m基于FPGA的MPPT最大功率跟踪算法verilog实现,包含testbench
该内容包括三部分:1) 展示了Vivado 2019.2和Matlab中关于某种算法的仿真结果图像,可能与太阳能光伏系统的最大功率点跟踪(MPPT)相关。2) 简述了MPPT中的爬山法原理,通过调整光伏电池工作点以找到最大功率输出。3) 提供了一个Verilog程序模块`MPPT_test_tops`,用于测试MPPT算法,其中包含`UI_test`和`MPPT_module_U`两个子模块,处理光伏电流和电压信号。
68 1
|
4月前
|
算法
基于kalman滤波的UAV三维轨迹跟踪算法matlab仿真
本文介绍了一种使用卡尔曼滤波(Kalman Filter)对无人飞行器(UAV)在三维空间中的运动轨迹进行预测和估计的方法。该方法通过状态预测和观测更新两个关键步骤,实时估计UAV的位置和速度,进而生成三维轨迹。在MATLAB 2022a环境下验证了算法的有效性(参见附图)。核心程序实现了状态估计和误差协方差矩阵的更新,并通过调整参数优化滤波效果。该算法有助于提高轨迹跟踪精度和稳定性,适用于多种应用场景,例如航拍和物流运输等领域。
201 12
|
4月前
|
算法 异构计算
FPGA强化(10):基于Sobel算法的边缘检测(二)
FPGA强化(10):基于Sobel算法的边缘检测(二)
58 0
|
4月前
|
算法 异构计算
FPGA强化(10):基于Sobel算法的边缘检测(一)
FPGA强化(10):基于Sobel算法的边缘检测
31 0
|
5月前
|
传感器 算法 定位技术
技术心得记录:常用的滤波算法
技术心得记录:常用的滤波算法
40 0
|
6月前
|
算法 TensorFlow 算法框架/工具
基于直方图的图像阈值计算和分割算法FPGA实现,包含tb测试文件和MATLAB辅助验证
这是一个关于图像处理的算法实现摘要,主要包括四部分:展示了四张算法运行的效果图;提到了使用的软件版本为VIVADO 2019.2和matlab 2022a;介绍了算法理论,即基于直方图的图像阈值分割,通过灰度直方图分布选取阈值来区分图像区域;并提供了部分Verilog代码,该代码读取图像数据,进行处理,并输出结果到&quot;result.txt&quot;以供MATLAB显示图像分割效果。
|
6月前
|
算法 计算机视觉 异构计算
基于直方图相似性的图像分类算法FPGA实现,包括tb测试文件和MATLAB辅助验证
该内容包含了一段关于图像处理算法的摘要,主要包括: 1. 展示了MATLAB和FPGA的测试结果图像,显示了图像读取完成的标志和相似性指标,其中图1与图2有较强相似性,图1与图3相似性较弱。 2. 算法使用的是vivado 2019.2和matlab 2022A版本。 3. 算法原理涉及图像直方图统计和直方图相似性度量,通过计算直方图的差异来衡量图像相似度,FPGA实现包括图像采集、直方图计算、比较和分类决策步骤。 4. 提供了一个部分核心Verilog程序,用于读取图像数据并在FPGA上进行直方图相似性计算。
|
15天前
|
算法 安全 数据安全/隐私保护
基于game-based算法的动态频谱访问matlab仿真
本算法展示了在认知无线电网络中,通过游戏理论优化动态频谱访问,提高频谱利用率和物理层安全性。程序运行效果包括负载因子、传输功率、信噪比对用户效用和保密率的影响分析。软件版本:Matlab 2022a。完整代码包含详细中文注释和操作视频。
|
1天前
|
算法 调度
基于遗传模拟退火混合优化算法的车间作业最优调度matlab仿真,输出甘特图
车间作业调度问题(JSSP)通过遗传算法(GA)和模拟退火算法(SA)优化多个作业在并行工作中心上的加工顺序和时间,以最小化总完成时间和机器闲置时间。MATLAB2022a版本运行测试,展示了有效性和可行性。核心程序采用作业列表表示法,结合遗传操作和模拟退火过程,提高算法性能。