首页 > 技术 > 内容

浅析基于FPGA的非线性滤波

时间:2026-01-22  作者:Diven  阅读:0

1

统计排序滤波

设r为处理窗口半径,I(x,y)为输入像素值,g(x,y)为输出像素值,则有如下定义:

g(x,y)=Sort(I(x+i,y+i),n)

-r≤i≤r,-r≤j≤r,0≤n< (2r+1)^2.

令n=(2r+1)2/2,则上式变为中值滤波器。常用的排序算子有冒泡排序、希尔排序即简单排序等,以冒泡排序为例,C++语言处理算法如下:中值滤波能够很好的消除椒盐噪声。效果图如下所示:2

基于FPGA的统计排序滤波器

1

并行全比较排序法

为了区别相同的数值,对各个数值的输入次序做如下规定:

当前数值大于本数据之前输入数据时,结果记为1,小于或等于时记为0.

当前数值大于或等于本数据之后输入数据时,结果记为1,小于时记为0.

与自身比较记为0.

利用此规则对输入数据进行排序,如下表所示:以3个数据d1,d2,d3的排序为例,需要设计的比较器数目为n(n-1)个。如下所示:

d_1≥d_2

d_1≥d_3

d_2>d_1

d_2≥d_3

d_3>d_1

d_3>d_2

2

整体设计与模块划分

采用与均值滤波类似的方法,先进行一维图像行方向上的排序,再对列方向上的行排序结果进行排序,即可得到一个窗口方向上的排序。同样的,行方向的对齐采用行缓存来实现,如下图所示:注意:并行全比较排序与C语言实现的冒泡排序结果,在某些特殊情况下还是有点差别的。如下所示:如果使用C语言冒泡排序,目标值会被判定为1,因为这9个数的排序如下:

1, 1, 1, 1 ,1, 0, 0, 0, 0

其“中值”为1,故判定为1.使用先行后列的全排序法,每行的中值如下:

1

0

0

再对这3个数进行排序,得到最终的中值为0.与C语言冒泡排序判定结果不同。只有在1与0的比值为5:4或4:5的情况下才会出现,其比值则不会出现判定结果不同。即便某些情况下判定结果可能不同,但都是中值附近的值,都具有中值滤波的效果。自己可以多列几种情况试试看。

想强调的是,先行后列的并行全比较排序和C语言的冒泡排序数据结果对比时,可能会出现某些数据不同,免得大家怀疑是程序编写错误。

3

median_1d模块设计

全并行排序的计算步骤如下

首先得到待排序的n个数据:可以通过打n-1拍得到。

进行全比较:当前数据与其所有数据依次比较,并记录比较结果。

将(2)中的记录结果相加。

查找(3)中相加结果按指定次序输出。

一维排序滤波电路设计如下所示:** 需要注意的是:din_r[2]为输入第0个数据,din_r[1]为输入第1个数据,din_r[0]为输入第2个数据。**

由于在求cmp_sum时,消耗了一个时钟周期,所以在求dout时,需要先对输入数据打一拍,即此时din_r[3]为输入第0个数据,din_r[2]为输入第1个数据,din_r[1]为输入第2个数据。

当cmp_sum[0]==OUT_ID时,将第0个数据(din_r[3])赋值给dout,

当cmp_sum[1]==OUT_ID时,将第1个数据(din_r[2])赋值给dout,

当cmp_sum[2]==OUT_ID时,将第2个数据(din_r[1])赋值给dout。

从上图可以看出,产生dout共需消耗5个时钟周期,dout_vld需要和dout信号同步,故同样需要对dout_vld打5拍,如下所示:上图中的KSZ为窗口长度,KSZ的值为3,故一行数据有两个数据无法做中值处理,所以dout_vld信号产生代码如下:2.4

median_2d模块设计

采用和均值滤波同样的思路来处理,整个计算步骤如下

计算一维行方向的排序结果输出。

将第(1)步的结果接入第一个行缓存,第一个行缓存的输出接入第二个行缓存,得到3行的一维输出。

对第(2)步输出的三个数据进行排序,得到结果输出。

完成时序对齐。

二维运算的电路设计如下图所示:由于行FIFO读出数据有一拍延时,所以median_1d输出的数据需要延时一拍,以便于FIFO读出数据对齐。从图4-6可以看出,产生median_data共需消耗3个时钟周期,median_vld有line_rd_en[2]产生,也需要延时3个时钟周期,以便于median_data信号对齐,产生代码如下:由于median_vld由line_rd_en[1]产生,故已经舍去了两行,所以此时不需要再与上其信号了,注意与median_1d模块的dout_vld做对比,自己理解一下。

3

仿真与调试

median_1d的测试激励如下:从图4-9可以看出,测试激励主要是产生0-9共10个数据,仿真结果如下所示:可以看出,中值结果是正确,尤其需要注意的是红色框框里的数据,8和1共产生了2次,这个地方使用书上的代码是有问题的。具体的自己看代码就知道了。

median_2d仿真有点麻烦,自己可以使用mspaint画图软件产生10*10的黑白图,然后再用qt将其转成txt,最后再使用modelsim进行仿真。也可以自己写测试激励。最终中值滤波结果如下图所示:

猜您喜欢


随着电子产品的不断发展,贴片电阻作为电子元器件中的基础元件,应用于各种电路设计中。准确识别贴片电阻的阻值,对于电路的正常运行和维修维护具有重要意义。本文将系统介...
2025-11-28 21:00:36
贴片电阻瞬时功率的计算通常发生在电路设计或分析阶段,而非产品制造或使用阶段。设计阶段,工程师需要确保所选贴片电阻能够承受电路中的最大瞬时功率,避免电阻过热而损坏...
2024-11-29 10:25:51
滤波电容器在现代电力电子设备中是非常重要的配件,其主要优势体现在以下几个方面。滤波电容器能够有效抑制电源中的高频噪声,确保输出信号的稳定性。这对于音频设备和通信...
2010-03-12 00:00:00
电阻作为电子元件中的基础部件,其规格和性能直接影响到电子设备的稳定性和效率。格莱尔(GLE)作为知名的电子元件品牌,其长电极电阻产品因性能优良、规格多样而受到市...
2022-01-02 13:54:54
LED灯以其节能环保的特点,已经逐渐取代了传统照明方式,走进了千家万户。然而,在使用LED灯的过程中,您是否遇到过灯光闪烁或亮度不稳定的情况?这可能是由LED灯...
2024-10-01 00:00:00
现代电子设备中,稳定的电源供应很重要。12V输出DC/DC转换器作为一种高效的电源转换设备,能够将不同电压等级的电源转换为稳定的12V直流电,为各种电子设备提供...
2024-03-01 00:00:00
随着电子产品的不断小型化和高性能化,贴片电阻作为电子元器件中的重要组成部分,其尺寸规格成为设计和采购中的关键因素。了解贴片电阻尺寸对照表,不仅有助于正确选型,还...
2025-11-10 21:00:36
升功率电阻作为关键的电子元器件,应用于电路中的限流、分压和功率消耗等领域。顺络(Sunlord)作为国内知名的电子元器件制造品牌,其升功率电阻产品因品质稳定、性...
2018-01-25 13:32:56
光敏电阻作为重要的光电转换元件,被应用于各种光线检测和自动控制系统中。Walsin(华新)作为知名的电子元件制造商,其光敏电阻产品以稳定的性能和优良的品质深受市...
2015-08-31 22:40:18
LCD显示屏的参数主要包括分辨率、亮度、对比度、响应时间和视角等几个关键指标。分辨率是指显示屏能够呈现的像素数量,通常以宽度乘高度的形式表示,例如1920x10...
2009-09-27 00:00:00