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

相关文章
|
4月前
|
算法 异构计算
m基于FPGA的MPPT最大功率跟踪算法verilog实现,包含testbench
该内容包括三部分:1) 展示了Vivado 2019.2和Matlab中关于某种算法的仿真结果图像,可能与太阳能光伏系统的最大功率点跟踪(MPPT)相关。2) 简述了MPPT中的爬山法原理,通过调整光伏电池工作点以找到最大功率输出。3) 提供了一个Verilog程序模块`MPPT_test_tops`,用于测试MPPT算法,其中包含`UI_test`和`MPPT_module_U`两个子模块,处理光伏电流和电压信号。
50 1
|
2月前
|
算法
基于kalman滤波的UAV三维轨迹跟踪算法matlab仿真
本文介绍了一种使用卡尔曼滤波(Kalman Filter)对无人飞行器(UAV)在三维空间中的运动轨迹进行预测和估计的方法。该方法通过状态预测和观测更新两个关键步骤,实时估计UAV的位置和速度,进而生成三维轨迹。在MATLAB 2022a环境下验证了算法的有效性(参见附图)。核心程序实现了状态估计和误差协方差矩阵的更新,并通过调整参数优化滤波效果。该算法有助于提高轨迹跟踪精度和稳定性,适用于多种应用场景,例如航拍和物流运输等领域。
|
2月前
|
算法 异构计算
FPGA强化(10):基于Sobel算法的边缘检测(二)
FPGA强化(10):基于Sobel算法的边缘检测(二)
41 0
|
2月前
|
算法 异构计算
FPGA强化(10):基于Sobel算法的边缘检测(一)
FPGA强化(10):基于Sobel算法的边缘检测
21 0
|
3月前
|
传感器 算法 定位技术
技术心得记录:常用的滤波算法
技术心得记录:常用的滤波算法
22 0
|
4月前
|
算法 TensorFlow 算法框架/工具
基于直方图的图像阈值计算和分割算法FPGA实现,包含tb测试文件和MATLAB辅助验证
这是一个关于图像处理的算法实现摘要,主要包括四部分:展示了四张算法运行的效果图;提到了使用的软件版本为VIVADO 2019.2和matlab 2022a;介绍了算法理论,即基于直方图的图像阈值分割,通过灰度直方图分布选取阈值来区分图像区域;并提供了部分Verilog代码,该代码读取图像数据,进行处理,并输出结果到&quot;result.txt&quot;以供MATLAB显示图像分割效果。
|
4月前
|
算法 计算机视觉 异构计算
基于直方图相似性的图像分类算法FPGA实现,包括tb测试文件和MATLAB辅助验证
该内容包含了一段关于图像处理算法的摘要,主要包括: 1. 展示了MATLAB和FPGA的测试结果图像,显示了图像读取完成的标志和相似性指标,其中图1与图2有较强相似性,图1与图3相似性较弱。 2. 算法使用的是vivado 2019.2和matlab 2022A版本。 3. 算法原理涉及图像直方图统计和直方图相似性度量,通过计算直方图的差异来衡量图像相似度,FPGA实现包括图像采集、直方图计算、比较和分类决策步骤。 4. 提供了一个部分核心Verilog程序,用于读取图像数据并在FPGA上进行直方图相似性计算。
|
4月前
|
存储 算法 算法框架/工具
基于HSV色度空间的图像深度信息提取算法FPGA实现,包含testbench和MATLAB辅助验证程序
该文档介绍了在一个FPGA项目中使用HSV色彩模型提取图像深度信息的过程。通过将RGB图像转换为HSV,然后利用明度与深度的非线性映射估计深度。软件版本为Vivado 2019.2和MATLAB 2022a。算法在MATLAB中进行了对比测试,并在FPGA上实现了优化,包括流水线并行处理和查找表技术。提供的Verilog代码段展示了RGB到灰度的转换。实验结果和核心程序的图片未显示。
|
15天前
|
算法 BI Serverless
基于鱼群算法的散热片形状优化matlab仿真
本研究利用浴盆曲线模拟空隙外形,并通过鱼群算法(FSA)优化浴盆曲线参数,以获得最佳孔隙度值及对应的R值。FSA通过模拟鱼群的聚群、避障和觅食行为,实现高效全局搜索。具体步骤包括初始化鱼群、计算适应度值、更新位置及判断终止条件。最终确定散热片的最佳形状参数。仿真结果显示该方法能显著提高优化效率。相关代码使用MATLAB 2022a实现。
|
15天前
|
算法 数据可视化
基于SSA奇异谱分析算法的时间序列趋势线提取matlab仿真
奇异谱分析(SSA)是一种基于奇异值分解(SVD)和轨迹矩阵的非线性、非参数时间序列分析方法,适用于提取趋势、周期性和噪声成分。本项目使用MATLAB 2022a版本实现从强干扰序列中提取趋势线,并通过可视化展示了原时间序列与提取的趋势分量。代码实现了滑动窗口下的奇异值分解和分组重构,适用于非线性和非平稳时间序列分析。此方法在气候变化、金融市场和生物医学信号处理等领域有广泛应用。

热门文章

最新文章