中值滤波资料收集(转)

来源:互联网 发布:编程对显卡的要求 编辑:程序博客网 时间:2024/06/06 04:14

因为要处理ppm信号用到中值滤波。IT屌丝为毛还要学这种东东T^T

收集相关资料如下

原文:

http://baike.baidu.com/view/277696.htm

http://blog.csdn.net/vincentzhao2009/article/details/4565601

一.百度百科

中值滤波法是一种非线性平滑技术,它将每一像素点的灰度值设置为该点某邻域窗口内所有像素点灰度值中值.
中值滤波原理
  中值滤波是基于排序统计理论的一种能有效抑制噪声的非线性信号处理技术,中值滤波的基本原理是把数字图像或数字序列中一点的值用该点的一个邻域中各点值的中值代替让周围的像素值接近的真实值,从而消除孤立的噪声点。方法是用某种结构的二维滑动模板,将板内像素按照像素值的大小进行排序,生成单调上升(或下降)的为二维数据序列。二维中值滤波输出为g(x,y)=med{f(x-k,y-l),(k,l∈W)} ,其中,f(x,y),g(x,y)分别为原始图像和处理后图像。W为二维模板,通常为2*2,3*3区域,也可以是不同的的形状,如线状,圆形,十字形,圆环形等。 
实现方法
   1:通过从图像中的某个采样窗口取出奇数个数据进行排序
   2:用排序后的中值取代要处理的数据即可

二.赵安元大神博客

这篇文章用到的中值滤波的算法如下:

      首先确定一个windowSize*windowSize大小的窗口,这里的windowSize是一个奇数,因此这个窗口一定会有一个中心的像素,中值滤波的过程就是不断的移动这个窗口,然后对窗口内的所有像素的像素值按照灰度级来排序最后把排序后中间那个像素的灰度级赋值给窗口中心那个像素。这个就是中值滤波的意义。

      举个例子,例如是3*3的窗口(数字表示灰度级):

     122  34  100

      20   18   201

     128  79   25

      排序后,就成了18,20,25,34,79,100,122,128,201,可以看到79就是中间那个数,因此这个3*3的窗口就变成了如下:

     122  34  100

      20   79   201

     128 79   25

     这个就是中值滤波的基本思想。

     说了这么多,贴代码吧:

windowSize = 3;

//windowSize是指窗口的长度。
v = (char *)calloc(windowSize*windowSize,sizeof(char));
//v存储的是窗口内所有像素的灰度级。

for(i=(windowSize-1)/2;i<height-(windowSize-1)/2;i++)

{
     for(j=(windowSize-1)/2;j<width-(windowSize-1)/2;j++)

     {  

/*这个嵌套的for循环是为了让窗口在整个图像内进行移动,i和j就是这个窗口的中心像素在整幅图像中坐标位置*/
         k=0;
         for(l=0;l<windowSize;l++)

        {
              for(m=0;m<windowSize;m++)

             {
                v[k]=h[i-(windowSize-1)/2+l][j-(windowSize-1)/2+m];
                k++;
              }
           }    

         //这个嵌套的for循环式获取这个窗口内的所有像素的灰度级,存储在v中
         BubbleSort(v,windowSize*windowSize);

        //对v内的元素进行排序
         h[i][j]=v[windowSize*windowSize/2]; 0123 4 5678

        //把排序后中间的那个数赋值给窗口的中心像素。
     }
}

效果图(因为图像很小,所以窗口大小我设置成了3):


处理之后的图像:


 

      在over前需要说的是这篇文章讲的中值滤波仅仅是最基础的思想,在进行滤波的时候可以加一些判断,来决定是否赋值,怎样赋值,等等。就说这么多吧。over。