珠海博杰电子在哪里:中值滤波器 ( Median Filter ) C++ 实现

来源:百度文库 编辑:偶看新闻 时间:2024/04/30 03:51:02
中值滤波器 ( Median Filter ) C++ 实现         均值滤波是像素周围的3*3的像素做平均值操作, 那么中值就是在3*3中的像素中寻找中值。 来看这样一个描述图(无图无真相) 这把可以清晰地看到, 这里有6,2,0,3,97,4,19,3,10这些像素, 然后中间的这些像素值就被这些像素的中位数也就是中值取代了。现在来看看在平滑和降噪方面的功效:原图1 中值滤波之后  噪声图(5%) 中值滤波后:          非常impressive的一点在这里就可以看出来了,很明显中值滤波不仅是图像变得平滑,同时去除了椒盐噪声(图像最外圈的像素没有去除掉只是因为没有从0-width处理而已)。从这里中值的逻辑来看, 我们做中值操作的时候, 那么白色(255)和黑色(0)因为是最大最小值, 除非周围的颜色都是黑色或者白色,不然一般都会被剔除掉, 这就是和均值最大的不同! 所以在效果上要好很多。一般来说这个中值滤波是去除椒盐噪声的非常理想的选择。代码:void medianFilter (unsigned char* corrupted, unsigned char* smooth, int width, int height)  
{  
      
    memcpy ( smooth, corrupted, width*height*sizeof(unsigned char) );  
    for (int j=1;j    {  
        for (int i=1;i        {  
            int k = 0;  
            unsigned char window[9];  
            for (int jj = j - 1; jj < j + 2; ++jj)  
                for (int ii = i - 1; ii < i + 2; ++ii)  
                    window[k++] = corrupted[jj * width + ii];  
            //   Order elements (only half of them)  
            for (int m = 0; m < 5; ++m)  
            {  
                int min = m;  
                for (int n = m + 1; n < 9; ++n)  
                    if (window[n] < window[min])  
                        min = n;  
                //   Put found minimum element in its place  
                unsigned char temp = window[m];  
                window[m] = window[min];  
                window[min] = temp;  
            }  
            smooth[ j*width+i ] = window[4];  
        }  
    }  
}   本文来自CSDN博客:http://blog.csdn.net/hhygcy/archive/2009/07/06/4325462.aspx