中值滤波的改进算法

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

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

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

第一行的最大值:Max1=max[M11,M12,M13];

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

第一行的最小值:Min1=min[M11,M12,M13];

依此类推:

      Max2=max[M21,M22,M23];Med2=med[M21,M22,M23];Min2=min[M21,M22,M23];

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

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

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

Min_of_Max=min[Max1,Max2,Max3];

Med_of_Med=med[Med1,Med2,Med3];

Max_of_Min=max[Min1,Min2,Min3];

则最后滤波结果:

Med_of_nine=med[Min_of_Max,Med_of_Med,Max_of_Min];

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

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

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

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

{max0,max1....max9};//10个

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

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

则有:max=MAX{max0,max1....max9};

med=MIN{max0,max1....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)是把图1(a)5×5的图像窗口像素各列沿箭头方向作降幂排列;步骤(2)接着把经过列降幂排列的每行像素沿箭头方向作行降幂排列,得到图1(d)的结果。在图1(d)中对各点数据在25个像素点中所处的位次进行判断,可以得到如下的结论,其中:

m11为25个像素数据中的最小值,m55为25个像素数据中的最大值;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

 中值滤波的改进算法_第1张图片
      限于篇幅原因,代码没有贴出来,完整的代码将在下一篇日志里挂出。

转载于:https://www.cnblogs.com/NIOS/archive/2009/08/25/1553310.html

你可能感兴趣的:(中值滤波的改进算法)