中值滤波的改进算法

  中值滤波的算法很多,但通常数据排序量较大。需要消耗大量时间,不利于图像处理的实时性。

1)窗口大小为3*3的快速排序算法

    为了便于说明。将3*3窗口内的各个像素分别定义为M11M12M13M21M22M23M31M32M33
    首先分别对窗口中的每一行计算最大值、中值、最小值,这样一共可以得到9个数值,分别包括3个最大值、3个中值、3个最小值:

    第一行的最大值:Max1=max[M11M12,M13]

    第一行的中值:Med1=med[M11M12,M13];

    第一行的最小值:Min1=min[M11M12,M13]

    依此类推:

      Max2=max[M21M22,M23]Med2=med[M21M22,M23]Min2=min[M21M22,M23]

      Max3=max[M31M32,M33];Med3=med[M31M32,M33]Min3=min[M31M32,M33]

    式中,max表示取最大值,med表示取中值,min表示取最小值。

    不难判断,9个数值中。3个最大值中的最大值和3个最小值中的最小值一定是9个像素中的最大值和最小值;3个中值中的最大值至少大于5个像素:即本行中的最小值、其他2行的中值及最小值:而3个中值中的最小值至少小于5个像素:即本行中的最大值、其他2行的中值及最小值。最后,比较3个最大值中的最小值Min_of_Max3个中值中的中值Med_of_Med3个最小值中的最大值Max_of_Min.得到的中间值即为滤波的最后结果Med_of_nine。具体过程表示如下:

Min_of_Max=min[Max1Max2,Max3]

Med_of_Med=med[Med1Med2Med3]

Max_of_Min=max[Min1Min2,Min3]

    则最后滤波结果:

Med_of_nine=med[Min_of_Max,Med_of_MedMax_of_Min]

    利用这种排序法的中值滤波运算仅需17次比较,与传统算法相比。比较次数减少了近2倍,且该算法十分适用于在FPGA上做并行处理,大大提高了滤波的速度。

2)窗口大小为5*5的快速排序算法

先看一个有5个元素的一维数组的排序方法

假设任意5个数为a,b,c,d,e。任意3个做比较,将会有三组每组10个输出,分别为

{max0max1....max9};//10

{med0,med1,.....med9};//10

{min0,min1,min2.....min9};//10

则有:max=MAX{max0max1....max9};

med=MIN{max0max1....max9}=MAX{min0,min1,min2.....min9};

submax=MAX{med0,med1,....med9};

submin=MIN{med0,med1.....med9};

min=MIN{min0,min1,min2.....min9};

1说明了采用本排序算法对5×5的图像窗口求取中值、最大值和最小值的步骤。图中的步骤(1)是把图1a5×5的图像窗口像素各列沿箭头方向作降幂排列;步骤(2)接着把经过列降幂排列的每行像素沿箭头方向作行降幂排列,得到图1d)的结果。在图1d)中对各点数据在25个像素点中所处的位次进行判断,可以得到如下的结论,其中:

m1125个像素数据中的最小值,m5525个像素数据中的最大值;

m12小于或等于其所在的原始列中的四个像素值和m13m14m15所在原始列的所有像素值(小于等于4+3×5=19个值),所以不可能为中值(中值排在第13位);

m13小于或等于其所在的原始列中的四个像素值和m14m15所在原始列的所有像素值(小于等于4+2×5=14个值),所以不可能为中值;

m21小于或等于其所在的原始列中的三个像素值和m22m23m24m25所在原始列的四个像素值(小于等于3+4×4=19个值),所以不可能为中值;

m22小于或等于其所在的原始列中的三个像素值和m23m24m25所在原始列的四个像素值(小于等于3+3×4=15个值),所以不可能为中值;

m31小于或等于其所在的原始列中的2个像素值和m32m33m34m35所在原始列的三个像素值(小于等于2+4×3=14个值),所以不可能为中值;

m54大于或等于其所在的原始列中的四个像素值和m51m52m53所在原始列的所有像素值(大于等于4+3×5=19个值),所以不可能为中值;

m54大于或等于其所在的原始列中的四个像素值和m51m52所在原始列的所有像素值(大于等于4+2×5=14个值),所以不可能为中值;

m45大于或等于其所在的原始列中的三个像素值和m41m42m43m44所在原始列的四个像素值(小于等于3+4×4=19个值),所以不可能为中值;

m44大于或等于其所在的原始列中的三个像素值和m41m42m43所在原始列的四个像素值(小于等于3+3×4=15个值),所以不可能为中值;

m35大于或等于其所在的原始列中的2个像素值和m34m33m32m31所在原始列的三个像素值(小于等于2+4×3=14个值),所以不可能为中值;

这样就排除掉12个值,不再参与下一级的比较。剩下的13个值通过步骤(4),沿图1d)箭头所示对角线方向做降幂排列得到图1e)的结果。在图1e)中对各点数据在13个数据中所处的位次进行判断,可以得到如下的结论,其中:

D52至少大于或等于其所在的原始列中的2个像素值或1个像素值(如果D52原来位于m25的位置)和D43D34D25所在原始列的所有像素值(大于或等于2+2×3+2=101+3×3=10个值),所以不可能为中值(中值排在第7位);

D43至少大于或等于其所在的原始列中的2个像素值或1个像素值(如果D43原来位于m25的位置)和D34D25所在原始列的所有像素值(大于等于2+1×3+2=71+2×3=7个值),所以不可能为中值;

D34至少大于或等于其原始位置左侧和上方的四个值,以及D25所在原始位置左侧和上方的四个值(至少大于等于4+4+1=9个值),所以不可能为中值;

D51至少大于或等于其原始位置上方的1个值(如果D51原来位于m51的位置)和D42D33D24D15以及它们上方的所有像素值(至少大于等于1+7=8个值),所以不可能为中值;

D42至少大于或等于其原始位置上方或左侧的1个值(如果D42原来位于m51m15的位置)和D33D24D15以及它们左侧和上方的所有像素值(至 少大于等于1+6=7个值),所以不可能为中值。

同理,也可以判断出D14至少小于或等于10个值;D23小于或等于7个值;D32小于或等于9个值;D15小于或等于8个值;D24小于或等于7个值,所以这几个像素点都不可能为中值;

这样就又排除掉10个值,不再参与下一级的比较。经过两步排除,剩余三个值D41D33D25,经过第(5)步,沿箭头方向的对角线作降幂排列,得到图1f)的结果,中值N33就为25个像素的中值。

      限于篇幅原因,代码没有贴出来,完整的代码将在下一篇日志里挂出。

       (抱歉,图片上传不了,今天实验室快关门了,改天再试)

 

转载于:https://www.cnblogs.com/NIOS/archive/2009/08/24/1553201.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值