中值滤波器 ( Median Filter ) C++ 实现[转]

来源:互联网 发布:linux u盘挂载 编辑:程序博客网 时间:2024/04/28 05:08

from 中值滤波器 ( Median Filter ) C++ 实现 


有了前面一个均值滤波器的基础, 在看中值滤波器就不是很容易继续了。均值滤波是像素周围的3*3的像素做平均值操作, 那么中值就是在3*3中的像素中寻找中值。 来看这样一个描述图(无图无真相)

这把可以清晰地看到, 这里有6,2,0,3,97,4,19,3,10这些像素, 然后中间的这些像素值就被这些像素的中位数也就是中值取代了。为了满足和前面一篇文章的格式相对应, 我们马上进入下一个单元, 来看看在平滑和降噪方面的功效!

原图1                                                                           中值滤波之后

噪声图(5%)                                                                中值滤波后:

非常impressive的一点在这里就可以看出来了, 很明显中值滤波不仅是图像变得平滑,同时去除了椒盐噪声(图像最外圈的像素没有去除掉只是因为我没有从0-width处理而已)。从这里中值的逻辑来看, 我们做中值操作的时候, 那么白色(255)和黑色(0)因为是最大最小值, 除非周围的颜色都是黑色或者白色,不然一般都会被剔除掉, 这就是和均值最大的不同! 所以在效果上要好很多。一般来说这个中值滤波是去除椒盐噪声的非常理想的选择。

一样的,最后还是贴一段我运行的代码:

[cpp] view plaincopy
  1. /** 
  2. ** method to remove noise from the corrupted image by median value 
  3. * @param corrupted input grayscale binary array with corrupted info 
  4. * @param smooth output data for smooth result, the memory need to be allocated outside of the function 
  5. * @param width width of the input grayscale image 
  6. * @param height height of the input grayscale image 
  7. */  
  8. void medianFilter (unsigned char* corrupted, unsigned char* smooth, int width, int height)  
  9. {  
  10.       
  11.     memcpy ( smooth, corrupted, width*height*sizeof(unsigned char) );  
  12.     for (int j=1;j<height-1;j++)  
  13.     {  
  14.         for (int i=1;i<width-1;i++)  
  15.         {  
  16.             int k = 0;  
  17.             unsigned char window[9];  
  18.             for (int jj = j - 1; jj < j + 2; ++jj)  
  19.                 for (int ii = i - 1; ii < i + 2; ++ii)  
  20.                     window[k++] = corrupted[jj * width + ii];  
  21.             //   Order elements (only half of them)  
  22.             for (int m = 0; m < 5; ++m)  
  23.             {  
  24.                 int min = m;  
  25.                 for (int n = m + 1; n < 9; ++n)  
  26.                     if (window[n] < window[min])  
  27.                         min = n;  
  28.                 //   Put found minimum element in its place  
  29.                 unsigned char temp = window[m];  
  30.                 window[m] = window[min];  
  31.                 window[min] = temp;  
  32.             }  
  33.             smooth[ j*width+i ] = window[4];  
  34.         }  
  35.     }  

0 0
原创粉丝点击