排大排小法

  该算法也适用于受污染比较严重的含椒盐噪声的图像。该算法首先根据椒盐噪声的特点,对滤波窗口中的像素进行一种排除最大和最小的操作,滤出椒盐噪声点。其次,根据图像中存在的边缘和拐角等类锐地区的特点对滤波窗口在进行一次排除次最大和次最小的操作,以保护图像的细节。这种算法不同于以往的均值和中值滤波,从极值这个角度,根据椒盐的特点进行处理,可以避免图像细节的丢失和整个图像的模糊化。

   算法用到的基本思想是根据椒盐噪声的特点,对滤波窗口中的像素进行一种排除最大和最小的操作。同时通过迭代,变换窗口的大小,达到较好的处理效果。

算法实现

 算法实现步骤为:

 在输入图像灰度值矩阵中任意取一个x(i, j)如果0 < x(i, j)< 255则滤波器输出

    时保持原像素不变。否则执行步骤(2)

 取一个中心在(i, j)大小为33的窗口,在其中找灰度最大值max和最小值min  

    如果x(m, n)=minx(m, n)=max则令x(m, n)=0则去除它。

 如果剩下的像素的个数大于等于3则去除它们中的最大和最小然后求其平均值作为输出。

         如果剩下的像素的个数大于零小于3则用它们的平均值作为滤波器的输出。

         如果剩下的像素的个数等于零执行步骤(3)

   取一个大小为5 ×5 窗口如果x (m , n) = min x (m , n) =max则令x (m , n)=  

      0 即去除它们。

         如果剩下的像素个数大于等于3则去除它们中的最大和最小用其平均作

            为滤波器的输出。

  如果剩下的像素的个数大于零小于3则用它们的平均值作为滤波器的输出。

  如果剩下的像素的个数等于零执行步骤(4)

   n = 5 时窗口中的像素均被丢弃用相邻四个滤波器输出值的平均值作为滤波器

      的输出。

  关键代码部分:

  if(*lpSrc==0||*lpSrc==255)               //当前像素为极值点

      {

       windowLength=3;                    //设置窗口大小为3

       int a=0;

       {

将当前像素点周围的像素点存储到temp数组中,

并进行冒泡排序……

}

   }

       int min,max,min1,max1;

       min=temp[0];                         //初始的最小值

       max=temp[8];                         //初始的最大值

       for(int s=0;s<9;s++)

       {

              if(temp[s]==min)

              min1=temp[s+1];                 //去掉最小之后保留当前最小值

              if(temp[s]==max)

              max1=temp[s-1];                  //去掉最大值后保留当前最大值

         temp[s]=0;                      //去掉该极值点

              count--;                                   

                                                  

      }

   if(count>=3)      //剩余元素个数大于等于3时,再次去除极值后均值处理

      {  

     sum=0;

       for(int t=0;t<9;t++)

             {                      //根据当前极值点进行排除最大和最小点

         if(temp[t]==min1||temp[t]==max1)            

                     {

            temp[t]=0;

                     count--;

                 }

                     sum+=temp[t];

           if(count!=0)           //均值处理

              {

           avg=(int)sum/count;

                     *lpSrc=avg;

        }

    }

     }

 else

      if(count>0&&count<3) //剩余元素个数在03之间时,直接进行均值处理

              {

              for(int c=0;c<9;c++)

                     sum+=temp[c];

                     *lpSrc=(int)sum/count;

               }

   else

             if(count==0) //剩余元素个数为0时,取窗口为5,重复窗口为3的处理

              {

windowLength=5;

                     count=25;

               ……..   

     


 //剩余元素个数为0使,用当前像素相邻四个点的均值进行代替

 if(count==0)

  *lpSrc=(int)( *(m_bit3->getBitData()+j*m_bit3->getLineBytes()+i-1)                                 

            +*(m_bit3->getBitData()+j*m_bit3->getLineBytes()+i+1)

                    +*(m_bit3->getBitData()+(j-1)*m_bit3->getLineBytes()+i)

                +*(m_bit3->getBitData()+(j+1)*m_bit3->getLineBytes()+i))/4;

 }

    其中,m_bit3为位图的指针,getBitData()为得到位图数据的方法,getLineBytes()为得到图像每行数据的长度的方法,这些方法都封装在位图类中。

此算法实现时主要思想就是针对极值点利用窗口操作,在冒泡法排序之后,不断去掉窗口内的极值点,这样的过程就会使窗口内保留的信息点个数和当前的极值点都发生变化,因此需要注意的就是在实现过程中要保留这些信息。算法没有很大的复杂度,但是需要迭代操作,运行时间较长。

 posted on 2008-05-29 19:19  郭晓明  阅读(478)  评论(1)    收藏  举报