1、 基本原理

图像信息在采集过程中往往受到各种噪声源的干扰,这些噪声在图像上的常常表现为一些孤立像素点,这可理解为像素的灰度是空间相关的,即噪声点像素灰度与它们临近像素的灰度有着显著不同。通常,一般的前置图像处理后的图刺昂仍然带有后续所不希望夹带的孤立像素点,这种干扰或孤立像素点如不经过滤波处理,会对以后的图像区域分割、分析和判断带来影响。

       对受到噪声污染的图像可以采用线性滤波的方法来处理,但是很多线性滤波有低通性,在去噪声的同时也使得边缘模糊了,中值滤波在某些情况下可以做到既去除噪声又保护图像的边缘,他是一种非线性的去噪声的方法。

       中值滤波的实现原理是把数字图像中的一点的值用该点的一个区域的各个点的值的中值代替,中值的定义如下:

一组数X1X2X3Xn 假如其排序如下:

X i 1X i 2X i 3X i n

      Y=Med{X1X2X3Xn }=Xi((1+n)/2)                    n为奇数

                            Xi(n/2) Xi((1+n)/2)                                    n为偶数

Y称为X1X2X3Xn 的中值,如有一个序列(10203040506070),则中值为40

把一个点的特定长度或形状的领域称为窗口,在一维的时候,中值滤波器是一个奇数各像素点的滑动窗口,窗口正中间的值用窗口内各个像素的中值代替。设输入为{Xi,iI2},则滤波器的输出为:

Yi=med{Xi}=med{Xi-uXuXi+u}

如果推广到二维,则可以定义输出为:

Yi=med{Xij}=med{X(i+s),(j+s)(r,s)A,(i,j)I2 }

对于二维滤波的中值滤波,一般采用3×3或者5×5的窗口来进行滤波。

2、 实现

procedure TForm1.Button2Click(Sender: TObject);

var

        p1,p2,p3,p4:pbytearray;

        Rvaluearray:array[0..10] of integer;

        i,j:integer;

begin

        self.DoubleBuffered:=true;//采用双缓冲模式

        ChangedBmp:=tbitmap.Create;

        testbmp:=tbitmap.Create;

        changedbmp.Assign(image1.Picture);

        testbmp.Assign(image1.Picture);

        for j:=1 to changedbmp.Height-2 do

        begin

                p1:=testbmp.ScanLine[j];    p2:=testbmp.ScanLine[j-1];

                p3:=changedbmp.ScanLine[j]; p4:=changedbmp.ScanLine[j-1];

                for i:=1 to changedbmp.Width-2 do

                begin

                        Rvaluearray[0]:=p2[3*(i-1)+2];

                        Rvaluearray[1]:=p2[3*i+2];

                        Rvaluearray[2]:=p2[3*(i+1)+2];

                        Rvaluearray[3]:=p3[3*(i-1)+2];

                        Rvaluearray[4]:=p3[3*i+2];

                        Rvaluearray[5]:=p3[3*(i+1)+2];

                        Rvaluearray[6]:=p4[3*(i-1)+2];

                        Rvaluearray[7]:=p4[3*i+2];

                        Rvaluearray[8]:=p4[3*(i+1)+2];

                        sort(Rvaluearray);

                        p1[3*i+2]:=Rvaluearray[4];

                        Rvaluearray[0]:=p2[3*(i-1)+1];

                        Rvaluearray[1]:=p2[3*i+1];

                        Rvaluearray[2]:=p2[3*(i+1)+1];

                        Rvaluearray[3]:=p3[3*(i-1)+1];

                        Rvaluearray[4]:=p3[3*i+1];

                        Rvaluearray[5]:=p3[3*(i+1)+1];

                        Rvaluearray[6]:=p4[3*(i-1)+1];

                        Rvaluearray[7]:=p4[3*i+1];

                        Rvaluearray[8]:=p4[3*(i+1)+1];

                        sort(Rvaluearray);

                        p1[3*i+1]:=Rvaluearray[4];

                        Rvaluearray[0]:=p2[3*(i-1)];

                        Rvaluearray[1]:=p2[3*i];

                        Rvaluearray[2]:=p2[3*(i+1)];

                        Rvaluearray[3]:=p3[3*(i-1)];

                        Rvaluearray[4]:=p3[3*i];

                        Rvaluearray[5]:=p3[3*(i+1)];

                        Rvaluearray[6]:=p4[3*(i-1)];

                        Rvaluearray[7]:=p4[3*i];

                        Rvaluearray[8]:=p4[3*(i+1)];

                        sort(Rvaluearray);

                        p1[3*i]:=Rvaluearray[4];

                end;

        end;

        ChangedBmp.Assign(TestBMP);

    PaintBox2.Canvas.CopyMode:=srccopy;        PaintBox2.Canvas.Draw(0,0,ChangedBmp);             

end;

 

3、 效果

可能二值化处理后的图像的感觉不是很明显,但是彩色图像进行滤波后明显感觉图像清晰很多,主要原因是通过滤波后一些噪点消除了。



Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=886800

posted on 2007-07-11 11:02  Thunderdanky  阅读(306)  评论(0)    收藏  举报