中值滤波和均值滤波的C++实现

把每个像素都用周围的9个像素来做均值操作 ”, 比如说这里有一个例子:

 

sample

非常明显的, 这个3*3区域像素的颜色值分别是5,3,6,2,1,9,8,4,7那么中间的1这个像素的过滤后的值就是这些值的平均值, 也就是前面的计算方法: (5+3+6+2+1+9+8+4+7)/9=5

一目了然。那么这个均值滤波器有什么用处呢?

主要还是平滑图像的用处, 有的图像的锐度很高,用这样的均值算法,可以把锐度降低。使得图像看上去更加自然,下面就有几幅图我们可以看出一些端倪:

原图:                                                                          原图均值滤波处理之后:


 

这里还是可以明显的感觉到不同的, 没有好坏之分,就是第二幅图片看上去更为平滑。 继续我们的问题, 那这里均值平滑是否具有去除噪声的功能呢? 我们搞来了椒盐噪声(就是随机的白点,黑点)来试试手:

噪声图(5%椒盐噪声):                         均值滤波平滑处理之后:


 

首先这里的噪声还是比较小的, 只有5%,从均值的效果来看的话, 我可以说几乎没有用,其实直观的想也可以判断, 因为这里的处理并没有剔除这些噪声点, 而只是微弱地降低了噪声,所以效果可以想见的。。

好吧, 最后的时候还是贴上一段处理的C++均值滤波算法代码:

void meanFilter (unsigned char* corrupted, unsigned char* smooth, int width, int height)  
{  
      
    memcpy ( smooth, corrupted, width*height*sizeof(unsigned char) );  //复制数据
      
    for (int j=1;j<height-1;j++)  //边界不处理
    {  
        for (int i=1;i<width-1;i++)  
        {  
            smooth [ j*width+i ] = (    corrupted [ (j-1)*width+(i-1) ] + corrupted [ (j-1)*width+i] + corrupted [ (j-1)*width+(i+1) ] +  
                                        corrupted [ j*width+(i-1) ]     + corrupted [ j*width+i]     + corrupted [ j*width+(i+1) ] +  
                                        corrupted [ (j+1)*width+(i-1) ] + corrupted [ (j+1)*width+i] + corrupted [ (j+1)*width+(i+1) ] ) / 9;  
        }  
    }  
} 

参考资源:

【1】百度百科,http://baike.baidu.com/link?url=mQ37rozxl6jHqzdVY56zOO_tpSvInR0EA8AGK5W242ljIXOxPz_xtTT8Bgi8fOVocmp6XpiI1FK6byALfUir1a

【2】网友hhygcyhttp://blog.csdn.net/hhygcy/article/details/4325462

注:

本文部分文字参考并整理自网络;

如果侵犯了您的版权,请联系本人tangyibiao520@163.com,本人将及时编辑掉!

文章导航