中值濾波器 ( Median Filter ) C++ 實現

来源:互联网 发布:2016爱卡发卡平台源码 编辑:程序博客网 时间:2024/04/28 05:04
http://blog.csdn.net/cay22/article/details/5546175 

中值濾波器 ( Median Filter ) C++ 實現

有了前面一個均值濾波器 的基礎, 在看中值濾波器就不是很容易繼續了。均值濾波是像素周圍的3*3的像素做平均值操作, 那麼中值就是在3*3中的像素中尋找中值。 來看這樣一個描述圖(無圖無真相)

 

 

這把可以清晰地看到, 這裡有6,2,0,3,97,4,19,3,10這些像素, 然後中間的這些像素值就被這些像素的中位數也就是中值取代了。為了滿足和前面一篇文章的格式相對應, 我們馬上進入下一個單元, 來看看在平滑和降噪方面的功效!

  

原圖1                                                                           中值濾波之後

 

  

噪聲圖(5%)                                                                中值濾波後:

 

非常impressive的一點在這裡就可以看出來了, 很明顯中值濾波不僅是圖像變得平滑,同時去除了椒鹽噪聲(圖像最外圈的像素沒有去除掉只是因為我沒有從0-width處理而已)。從這裡中值的邏輯來看, 我們做中值操作的時候, 那麼白色(255)和黑色(0)因為是最大最小值, 除非周圍的顏色都是黑色或者白色,不然一般都會被剔除掉, 這就是和均值最大的不同! 所以在效果上要好很多。一般來說這個中值濾波是去除椒鹽噪聲的非常理想的選擇。

 

一樣的,最後還是貼一段我運行的代碼:

 

view plaincopy to clipboardprint?

/** 

** method to remove noise from the corrupted image by median value 

* @param corrupted input grayscale binary array with corrupted info 

* @param smooth output data for smooth result, the memory need to be allocated outside of the function 

* @param width width of the input grayscale image 

* @param height height of the input grayscale image 

*/ 

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<height-1;j++)  

    {  

        for (int i=1;i<width-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

原创粉丝点击