当前位置 : 安防网>安防技术>图形图像>阅读正文

中值滤波算法

作者: 时间:2008-05-23

    本文提出一种中值滤波算法,该算法充分地利用相邻两次中值滤波窗口内数据的相关性。中值滤波算法在运算过程中通过对有序序列快速的对半查找和内插操作,重构有序序列,占L面得到各中值算法很大地提高了运算效率-计算机模拟寝明该方法是有效的。

    在数字信号处理中,经常会遇到对信号数据作平滑处理。局部平均滤波是常用的一种算法,若是对具有随机脉冲噪声的信号进行处理,虽然脉冲噪声有所衰减,但它对滤波结果仍有显著的影响。中值滤波却是对窗内数据进行大小的排序,取结果的中间项对应的值,这样脉冲噪声就不起作用,不影响中值结果 所以,中值滤波在有随机脉冲噪声的情况下,能较好地保护原始信号。
    中值滤波的主要运算就是对窗口内的信号数据序列进行排序。文[4]提出的二维中值滤波快速算法,只适用于幅度量化级为极其有限的数据(如:数字图象处理中的象素幅度,若是用单字节(8位二进制存贮单元)存放,共有28=256个灰度级),原因是要给每个量化级设置一个作为计数器的存贮单元。文[5—8]的方法也是针对于幅度量化级为有限的数据。若是数据为任意大小或精度的浮点数,则以上的方法不适用,通常采用每次对窗内数据排序并
输出相应的中值。假设原始信号数据序列的长度为 ,表示为{ (O),x(1),⋯,x(M-1)},窗口长度为2^r+1,表示为{ (O), (1),⋯, (2Ⅳ)},共需要 一2N次对长度为2N+l的窗内数据序列分别进行排序。要进行排序,就必须对序列中数据元索做比较和交换.数据元素问的比较次数是影响排序速度的一个重要因素。一般认为,对 个元素进行排序时,所需的比较次数在理论上的最小值为 0(n|og。n) 当原始信号数据序列较长或窗口较大时,用
这种传统中值滤波方法是十分费时的。文[9]提出把相邻两次的中值滤波合并为一次进行,只做一次排序。从而,总的排序次数减少一半,运算时间节省约一半本文提出一种中值滤波的快速算法,避免了反复对无序序列排序,而只对有序序列进行数据元素的快速查找和内插,实现中值滤波.

中值滤波的快速算法
    本文提出的中值滤波的快速算法的基本思想是:原始数据序列上中值滤波的滑窗在移动过程中,当前窗只要删除其最早的元素,加入窗后的新元素,即成为下一窗的内容。下一窗的中值滤波实现可利用上次中值滤波的排序结果,新元素的插人位置用有序序列快速查找算法求得,新元素插人与最早的元素删除的实现采用独特的数据结构,将是新元素覆盖最早的元素,即是插人兼并了删除。
    设置(2N+1)个连续存贮单元(存放浮点数){ (。)t (1),⋯, (2Ⅳ)}组成的循环序列用来存放窗内的数据元素 按照先进先出的原则,后来的数据元素总是替换当前最早存放的数据元素。设置(2/'/+1)个连续存贮单元(存放整数){ (。), (1),⋯ ,s(2N)}顺序存放的是,若上述窗内元素从小至大排序后,顺序的元素在Ⅳ 序列中的下标值,即满足 ( (。))≤w(s(1))≤ ⋯≤w( (2Ⅳ))。设置(2Ⅳ+1)个连续存贮单元(存放整数){a(0),n(1),⋯,a(ZN)}分别存放s序列中存有其下标的存贮单元的下标值,即满足 (。(f)), =O,1,⋯2N。可以这样认为,把Ⅳ 序列和n序列中具有同一下标的两个存贮单元当作独立结构单元,s序列中一存贮单元指向上述某一结构单元,这个结构单元中的。存贮单元值表示了这个结构单元指向该s存贮单元。下面实现中值滤波的快速算法。首先,令Ⅳ 序列中的存贮单元值全为零,s序列和n序列中的存贮单元分别存放各自的下标值,即 (f)=0, (f)=f,n(f)=f,f=O,1 。,2N。另外,设置下标 =0.
    第一步,求当前准备进入窗的数据元素x(ra)在s序列中的内插位置,用对半查找算法实现脚,如图1所示。在图1中,有序序列对半查找的区问下界为工,上界为h,中部为 ,通过比较 (s(1))与待查量 (m),若不相等,则调整L或h,使下次查找的区问比前次的减少一半。输出的 反映了 (s(1))≤ (m)≤ (s( +1)),其中:一1≤ ≤2N。由于 (s(一1))和(s(2Ⅳ+1))不存在,可把它们当作特殊的符号,假想 (s(一1))为无穷小, (#(2Ⅳ+1))
为无穷大。对由n个元素组成的有序序列,若是用对半查找算法,至多做与l+[1og:n]个元素的比较就能找到元素的内插位置.
    第二步,在W,s,n序列中插入x(ra)的有关信息,如图2所示。若^<n( ),则将s序列第l+1至第n( )一1问各存贮单元所存值顺序地移到下一单元,并将该单元所存值作为下标对应的。序列中存贮单元指向该s单元,最后赋值 ( )= (m),n( )=l+1,s(k+1)= •若。( )≤ ,则将s序列中第n(』)+1至第 问各存贮单元所存值顺序地移到前一单元,并要将该单元所存值作为下标对应的n序列中存贮单元指向该s单元,最后赋值 ( )( ),口( )=/z,5(1)= 。此时,w(s(Ⅳ))为序列{x(m一2N), ( 一2N+1),⋯, (m)}的中值。
    第三步,令,为( +1)rood(2/'/+1),m增加1,取下一个 值,返回第一步按同样步骤求下一中值。如此反复进行,快速求得一系列中值。S和n序列中存贮单元的大小若是选择为单字节(计算机内存最小分配单元),可保证中值滤波窗口长度达到2s;2s6,这能满足大多数中值滤波的要求。于是,图2中的针对存贮单元的操作显得快捷。
    总之,本文提出的中值滤波算法的快速特性在于t为了求一个中值,运算时间主要用在做一次对半查找,至多与1+[1ogz(2N+1)]个数据元素比较。由于数据元素为任意大小或精度的浮点数,所以窗内任意两个元素完全相同的可能性极小,求元素内插位置时数据元素的比较个数基本上为1+r-logt(2Ⅳ+1)]。另外,运算时间还包括S和n序列完成数据元素内插时所进行的线性过程。

2 计算机模拟结果
    为了比较中值滤波的传统算法、文r-93算法和本文提出的快速算法运算速度,在386PC微机上做了模拟。其中,排序算法用目前公认的速度最快的一种排序算法,是由C.A.R,Hoare发明的快速排序0 ,运算量为:O(nlog )。模拟结果如表1,其中运算时间表示微机内时钟的嘀嗒数,每秒共18.2次。从表中看出,文[93算法比传统算法节省时间近一半,而本文算法所花时间更少。尤其,当原始数据的长度和窗口长度增加时,本文算法的效率更高。

上一页12 下一页
最新评论共有 2 位网友发表了评论
发表评论
评论内容:不能超过250字,需审核,请自觉遵守互联网相关政策法规。
用户名: 密码:
匿名?
注册