高斯濾波及離散化

本博客轉載自http://www.cnblogs.com/ping-36/articles/2810203.html請尊重版權,謝謝博主的分享,受益匪淺

預備知識:

      所謂徑向基函數 (Radial Basis Function 簡稱 RBF), 就是某種沿徑向對稱的標量函數。 通常定義爲空間中任一點x到某一中心xc之間歐氏距離的單調函數 , 可記作 k(||x-xc||), 其作用往往是局部的 , 即當x遠離xc時函數取值很小。最常用的徑向基函數是高斯核函數 ,形式爲 k(||x-xc||)=exp{- ||x-xc||^2/(2*σ)^2) } 其中xc爲核函數中心,σ爲函數的寬度參數 , 控制了函數的徑向作用範圍。

 

1、高斯濾波原理

     高斯濾波器是一類根據高斯函數的形狀來選擇權值的線性平滑濾波器。

     常用的零均值離散高斯濾波器函數:

     g(x)=exp( -x^2/(2 sigma^2)

  其中,高斯分佈參數Sigma決定了高斯函數的寬度。對於圖像處理來說,常用二維零均值離散高斯函數作平滑濾波器。

   高斯函數具有五個十分重要的性質(這5個性質表明, 高斯平滑濾波器無論在空間域還是在頻率域都是十分有效的低通濾波器):

  (1)二維高斯函數具有旋轉對稱性,即濾波器在各個方向上的平滑程度是相同的.一般來說,一幅圖像的邊緣方向是事先不知道的,因此,在濾波前是無法確定一個方向上比另一方向上需要更多的平滑.旋轉對稱性意味着高斯平滑濾波器在後續邊緣檢測中不會偏向任一方向.

  (2)高斯函數是單值函數.這表明,高斯濾波器用像素鄰域的加權均值來代替該點的像素值,而每一鄰域像素點權值是隨該點與中心點的距離單調增減的.這一性質是很重要的,因爲邊緣是一種圖像局部特徵,如果平滑運算對離算子中心很遠的像素點仍然有很大作用,則平滑運算會使圖像失真.

  (3)高斯函數的付立葉變換頻譜是單瓣的.這一性質是高斯函數付立葉變換等於高斯函數本身這一事實的直接推論.圖像常被不希望的高頻信號所污染(噪聲和細紋理).而所希望的圖像特徵(如邊緣),既含有低頻分量,又含有高頻分量.高斯函數付立葉變換的單瓣意味着平滑圖像不會被不需要的高頻信號所污染,同時保留了大部分所需信號.

  (4)高斯濾波器寬度(決定着平滑程度)是由參數σ表徵的,而且σ和平滑程度的關係是非常簡單的.σ越大,高斯濾波器的頻帶就越寬,平滑程度就越好.通過調節平滑程度參數σ,可在圖像特徵過分模糊(過平滑)與平滑圖像中由於噪聲和細紋理所引起的過多的不希望突變量(欠平滑)之間取得折衷.

  (5)由於高斯函數的可分離性,較大尺寸的高斯濾波器可以得以有效地實現.二維高斯函數卷積可以分兩步來進行,首先將圖像與一維高斯函數進行卷積,然後將卷積結果與方向垂直的相同一維高斯函數卷積.因此,二維高斯濾波的計算量隨濾波模板寬度成線性增長而不是成平方增長.

 

     二維高斯函數爲:

     前面的常數項是要確保整個平面的積分值是1,但在實際應用中經常被忽略,如下:

   高斯函數各向同性,其曲線是草帽狀的對稱圖,該曲線對整個覆蓋面積求積分爲1。高斯濾波的思路就是:對高斯函數進行離散化,以離散點上的高斯函數值爲權值,對我們採集到的灰度矩陣的每個像素點做一定範圍鄰域內的加權平均,即可有效消除高斯噪聲。

2、高斯濾波離散化

     一個離散的高斯卷積核 H: 2k+1x2k+1 可以用下式計算得到,H(i,j)爲

image

其中Sigma爲方差,k確定核矩陣的維數。sigma的取值值得注意,太小矩陣中只有一個非零元素,太大的話k也要大,不然周圍點的貢獻將被忽略。一般是k的一個函數。

    (轉自http://www.baisi.net/viewthread.php?tid=219452) 

     高斯函數的最佳逼近由二項式展開的係數決定,換句話說,用楊輝三角形(也稱Pascal三角形)的第n行作爲高斯濾波器的一個具有n個點的一維逼近,例如,五點逼近爲:

1 4 6 4 1

它們對應於Pascal三角形的第5行.這一模板被用來在水平方向上平滑圖像.在高斯函數可分離性性質中曾指出,二維高斯濾波器能用兩個一維高斯濾波器逐次卷積來實現,一個沿水平方向,一個沿垂直方向.實際中,這種運算可以通過使用單個一維高斯模板,對兩次卷積之間的圖像和最後卷積的結果圖像進行轉置來完成. 這一技術在模板尺寸N約爲10時的濾波效果極好.對較大的濾波器,二項式展開係數對大多數計算機來說都太多.但是,任意大的高斯濾波器都能通過重複使用小高斯濾波器來實現.高斯濾波器的二項式逼近的σ可用高斯函數擬合二項式係數的最小方差來計算.

  設計高斯濾波器的另一途徑是直接從離散高斯分佈中計算模板權值。爲了計算方便,一般希望濾波器權值是整數。在模板的一個角點處取一個值,並選擇一個K使該角點處值爲1。通過這個係數可以使濾波器整數化,由於整數化後的模板權值之和不等於1,爲了保證圖像的均勻灰度區域不受影響,必須對濾波模板進行權值規範化。

 

  高斯濾波器的採樣值或者高斯濾波器的二項式展開係數可以形成離散高斯濾波器.當用離散高斯濾波器進行卷積時,其結果是一個更大的高斯離散濾波器.若一幅圖像用N*N離散高斯濾波器進行平滑,接着再用M*M離散高斯濾波器平滑的話,那麼平滑結果就和用(N+M-1)*(N+M-1)離散高斯濾波器平滑的結果一樣.換言之,在楊輝三角形中用第N行和第M行卷積形成了第N+M-1行.

 

 以下對高斯卷積核的矩陣算法進行驗證。(轉自http://blog.sina.com.cn/s/blog_640577ed0100yz8v.html

  1)在matlab中用以下代碼可以產生一個3×3的核。

                                      filter=fspecial('gaussian',3,1);

  所產生的核矩陣爲:

                            filter =

                                      0.0751 0.1238 0.0751

                                      0.1238 0.2042 0.1238

                                      0.0751 0.1238 0.0751

  2)同樣對於上述的公式,我們取k=1,Sigma=1,即可得到3×3的高斯卷積核如下:

    上文說到,我們進行加權濾波,權係數之和必須爲1,上面所求出的高斯濾波核函數同樣的必須進行歸一化:

    由此可以證明該核函數計算方法的正確性。

OpenCv中cvSmooth函數的用法

  該函數原型爲:

            void cvSmooth(const CvArr* src, CvArr* dst,

                        int smoothtype=CV_GAUSSIAN,

                        int param1=3, int param2=0,double param3=0, double param4=0 );

  該函數前三個參數很容易理解,至於後四個參數以下進行分析。

  1) 如果指定param1和param2,則代表核函數的行列,即爲濾波窗口的寬度和高度;

  2) Param3:高斯卷積的Sigma值

  3) 如果用戶希望採用非對稱的高斯核,則引入param4,最後兩個參數分別代表水平核以及垂直核維數;

  4) 如果param3沒有給出,則有前兩個參數param1和param2計算出Sigma。這裏的根據是高斯分佈的特點(如圖所示,數值分佈在(μ—3σ,μ+3σ)中的概率爲0.9974),如果核矩陣更大,那麼相應的Sigma也更大,相反,如果Sigma更大,那麼核矩陣覆蓋範圍也更大。具體到OpenCv下,用如下公式進行計算(根據其源代碼顯示)。

    5)同樣的根據這個公式可知,如果param1和param2爲0(或者沒有給出),那麼濾波窗口的尺寸,則有後兩個參數代表的Sigma來確定。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章