1. 程式人生 > >自適應中值濾波及實現

自適應中值濾波及實現

前言

無意中看到了一篇比較老的論文,Adaptive median filters: new algorithms and results。感興趣的可以下載下來看看。主要就是提出了一種自適應中值濾波演算法,這個演算法是很經典的中值濾波演算法的改進版本,自動選擇濾波器的大小,以追求更好的效果。原理十分簡單,後面都儘量簡短地進行說明。

中值濾波器(Median Filter)

中值濾波的思想就是比較一定領域內的畫素值的大小,取出其中值作為這個領域的中心畫素新的值。假設對一定領域內的所有畫素從小到大進行排序,如果存在孤立的噪聲點,比如椒鹽噪聲(椒噪聲——較小的灰度值,呈現的效果是小黑點;鹽噪聲——較大的灰度值,呈現的效果是小白點),那麼從小到大排序的這個陣列中,那些孤立的噪聲一定會分佈在兩邊(要麼很小,要麼很大),這樣子取出的中值點可以很好地保留畫素資訊,而濾除了噪聲點的影響。
中值濾波器受濾波視窗大小影響較大,用於消除噪聲和保護影象細節,兩者會存在衝突。如果視窗較小,則能較好地保護影象中的一些細節資訊,但對噪聲的過濾效果就會打折扣;反之,如果視窗尺寸較大則會有較好的噪聲過濾效果,但也會對影象造成一定的模糊效果,從而丟失一部分細節資訊。另外,如果在濾波視窗內的噪聲點的個數大於整個視窗內畫素的個數,則中值濾波就不能很好的過濾掉噪聲。

自適應中值濾波器(Adaptive Median Filter)

在噪聲密度不是很大的情況下(根據經驗,噪聲的出現的概率小於0.2),使用中值濾波的效果不錯。但是當噪聲出現的概率比較高時,原來的中值濾波演算法就不是很有效了。只有增大濾波器視窗尺寸,儘管會使影象變得模糊。
使用自適應中值濾波器的目的就是,根據預設好的條件,動態地改變中值濾波器的視窗尺寸,以同時兼顧去噪聲作用和保護細節的效果。
下面是自適應中值濾波器演算法的詳細描述:
預先定義好以下符號:

  • Sxy:濾波器的作用區域,濾波器視窗所覆蓋的區域,該區域中心點為影象中第y行第x列個畫素點;
  • ZminSxy中最小的灰度值;
  • ZmaxSxy中最大的灰度值;
  • ZmedSxy中所有灰度值的中值;
  • Zxy:表示影象中第y行第x列個畫素點的灰度值;
  • SmaxSxy所允許的最大視窗尺寸;

自適應中值濾波器分為以下兩個過程,AB
A:
1. A1 = Zmed - Zmin
2. A2 = Zmed - Zmax
3. 如果A1>0A2<0,則跳轉到B
4. 否則,增大視窗的尺寸
5. 如果增大後的尺寸Smax,則重複A
6. 否則,直接輸出

Zmed
B
1. B1 = Zxy - Zmin
2. B2 = Zxy - Zmax
3. 如果B1>0B2<0,則輸出Zxy
4. 否則輸出Zmed

直觀解釋

在自適應中值濾波演算法中,A步驟裡面會先判斷是否滿足Zmin<Zmed<Zmax。這一步驟實質是判斷當前區域的中值點是否是噪聲點,通常來說是滿足Zmin<Zmed<Zmax這個條件的,此時中值點不是噪聲點,跳轉到B;考慮一些特殊情況,如果Zmed=Zmin或者Zmed=Zmax,則認為是噪聲點,應該擴大視窗尺寸,在一個更大的範圍內尋找一個合適的非噪聲點,隨後再跳轉到B,否則輸出的中值點是噪聲點;
接下來考慮跳轉到B之後的情況:判斷中心點的畫素值是否是噪聲點,判斷條件為