#中值濾波
中值濾波法是一種非線性平滑技術,它將每一像素點的灰度值設置為該點某鄰域窗口內的所有像素點灰度值的中值.中值濾波是基于排序統計理論的一種能有效抑制噪聲的非線性信號處理技術,中值濾波的基本原理是把數字圖像或數字序列中一點的值用該點的一個鄰域中各點值的中值代替,讓周圍的像素值接近的真實值,從而消除孤立的噪聲點。方法是用某種結構的二維滑動模板,將板內像素按照像素值的大小進行排序,生成單調上升(或下降)的為二維數據序列。二維中值濾波輸出為g(x,y)=med{f(x-k,y-l),(k,l∈W)} ,其中,f(x,y),g(x,y)分別為原始圖像和處理后圖像。W為二維模板,通常為3*3,5*5區域,也可以是不同的的形狀,如線狀,圓形,十字形,圓環形等。
**以3*3的濾波窗口為例:**
中值濾波就是在3*3中的像素中尋找中值。 來看這樣一個描述圖(不然無圖無真相)

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

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

?
很明顯中值濾波不僅使得圖像變得平滑(也可以理解為圖像變得模糊了),但是其對去除了椒鹽噪聲特別有效,因為中值濾波就是專門針對去除孤立點噪聲孕育為生的。從這里中值的邏輯來看, 我們做中值操作的時候, 那么白色(接近255的像素點)和黑色(接近0的像素)因為在窗口排序時是最大最小值, 除非周圍的顏色都是黑色或者白色,不然一般都會被剔除掉,所以,一般來說這個中值濾波是去除椒鹽噪聲的非常理想的選擇。
最后還是貼一段我運行的代碼:
~~~
void medianFilter(BYTE* pcorrPic, BYTE* psmoothPic, int width, int height)
{
memcpy(psmoothPic, pcorrPic, width*height*sizeof(BYTE));
for (int j = 1; j < height - 1; j++)//排除鄰邊
{
for (int i = 1; i < width - 1; i++)
{
int k = 0;
BYTE window[9];
for (int jj = j - 1; jj < j + 2; ++jj)
for (int ii = i - 1; ii < i + 2; ++ii)
window[k++] = pcorrPic[jj * width + ii];
// 元素排序 (一半即可)
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;
// 找到最小值應該放置的位置
BYTE temp = window[m];
window[m] = window[min];
window[min] = temp;
}
psmoothPic[j*width + i] = window[4];
}
}
}
~~~
#均值濾波
“**把每個像素都用周圍的9個像素來做均值操作**?”, 比如說這里有一個例子:
?

非常明顯的, 這個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】網友[hhygcy](http://my.csdn.net/hhygcy),http://blog.csdn.net/hhygcy/article/details/4325462
**注:**
**本文部分文字參考并整理自網絡;**
**如果侵犯了您的版權,請聯系本人tangyibiao520@163.com,本人將及時編輯掉!**