查看: 450|回复: 1

[教程] 用C++ 实现均值滤波

[复制链接]

61

主题

0

好友

1223

积分

进士

Rank: 5Rank: 5

  • TA的每日心情
    开心
    2015-7-14 09:10
  • 签到天数: 9 天

    连续签到: 1 天

    [LV.3]偶尔看看II

    发表于 2017-7-18 09:19:25 |显示全部楼层
    滤波器听来玄而又玄,真正拿来看了之后就不过尔尔了, 这把拿了一个均值滤波器的例子来做记录, 希望可以依次把一些median filter, gaussian blur都拿来说说。
    好吧言归正传, 这里就具体说说均值滤波器是什么东西吧。其实这个东西就是在图像处理的时候, “把每个像素都用周围的8个像素来做均值操作”, 比如说这里有一个例子:

    TIM截图20170718091353.png


    图通常是最能说明问题的东西, 非常明显的, 这个3*3区域像素的颜色值分别是5,3,6,2,1,9,8,4,7那么中间的1这个像素的过滤后的值就是这些值的平均值, 也就是前面的计算方法: (5+3+6+2+1+9+8+4+7)/9=5
    一目了然。那么这个均值滤波器有什么用处呢?
    主要还是平滑图像的用处, 有的图像的锐度很高,用这样的均值算法,可以把锐度降低。使得图像看上去更加自然,下面就有几幅图我们可以看出一些端倪:

    原图:
    sample1.png


    平滑处理之后:
    sample2.png


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

    噪声图(5%):     
    sample3.png


    平滑处理之后:
    sample4.png


    首先这里的噪声还是比较小的, 只有5%,从均值的效果来看的话, 我可以说几乎没有用,其实直观的想也可以判断, 因为这里的处理并没有剔除这些噪声点, 而只是微弱地降低了噪声,所以效果可以想见的。。
    最后贴上一段处理的代码:
    1. <font size="3">    /**
    2.     ** method to remove noise from the corrupted image by mean 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 meanFilter (unsigned char* corrupted, unsigned char* smooth, int width, int height)  
    9.     {  
    10.          
    11.         memcpy ( smooth, corrupted, width*height*sizeof(unsigned char) );  
    12.          
    13.         for (int j=1;j<height-1;j++)  
    14.         {  
    15.             for (int i=1;i<width-1;i++)  
    16.             {  
    17.                 smooth [ j*width+i ] = (    corrupted [ (j-1)*width+(i-1) ] + corrupted [ (j-1)*width+i] + corrupted [ (j-1)*width+(i+1) ] +  
    18.                                             corrupted [ j*width+(i-1) ]     + corrupted [ j*width+i]     + corrupted [ j*width+(i+1) ] +  
    19.                                             corrupted [ (j+1)*width+(i-1) ] + corrupted [ (j+1)*width+i] + corrupted [ (j+1)*width+(i+1) ] ) / 9;  
    20.             }  
    21.         }  
    22.     }  </font>
    复制代码
    我有点小懒。一般处理的时候通常还有边界上的一些处理, 但是我这里就简单的从1...width-1来处理, 所以第一个和最后一个像素就简单的抛掉了, 如果只是简单的看看效果还是没有问题的!


    回复

    使用道具 举报

    8

    主题

    0

    好友

    2079

    积分

    进士

    Rank: 5Rank: 5

  • TA的每日心情
    奋斗
    昨天 17:46
  • 签到天数: 412 天

    连续签到: 4 天

    [LV.9]以坛为家II

    发表于 2017-7-18 09:38:46 |显示全部楼层
    C++做算法比较适合。
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    关闭

    站长推荐上一条 /4 下一条

    手机版|爱板网 |网站地图  

    GMT+8, 2017-8-24 14:41 , Processed in 0.475921 second(s), 12 queries , Memcache On.

    苏公网安备 32059002001056号

    Powered by Discuz!

    回顶部