高斯模糊的演算法

2019-08-25 23:37:20

(給演算法愛好者加星標,修煉程式設計內功

來源:阮一峰

http://www.ruanyifeng.com/blog/2012/11/gaussian_blur.html

通常,影象處理軟體會提供"模糊"(blur)濾鏡,使圖片產生模糊的效果。



"模糊"的演算法有很多種,其中有一種叫做"高斯模糊"(Gaussian Blur)。它將正態分佈(又名"高斯分佈")用於影象處理。



本文介紹"高斯模糊"的演算法,你會看到這是一個非常簡單易懂的演算法。本質上,它是一種資料平滑技術(data smoothing),適用於多個場合,影象處理恰好提供了一個直觀的應用例項。


一、高斯模糊的原理


所謂"模糊",可以理解成每一個畫素都取周邊畫素的平均值。


上圖中,2是中間點,周邊點都是1。


"中間點"取"周圍點"的平均值,就會變成1。在數值上,這是一種"平滑化"。在圖形上,就相當於產生"模糊"效果,"中間點"失去細節。



顯然,計算平均值時,取值範圍越大,"模糊效果"越強烈。



上面分別是原圖、模糊半徑3畫素、模糊半徑10畫素的效果。模糊半徑越大,影象就越模糊。從數值角度看,就是數值越平滑。


接下來的問題就是,既然每個點都要取周邊畫素的平均值,那麼應該如何分配權重呢?


如果使用簡單平均,顯然不是很合理,因為影象都是連續的,越靠近的點關係越密切,越遠離的點關係越疏遠。因此,加權平均更合理,距離越近的點權重越大,距離越遠的點權重越小。


二、正態分佈的權重


正態分佈顯然是一種可取的權重分配模式。



在圖形上,正態分佈是一種鐘形曲線,越接近中心,取值越大,越遠離中心,取值越小。


計算平均值的時候,我們只需要將"中心點"作為原點,其他點按照其在正態曲線上的位置,分配權重,就可以得到一個加權平均值。


三、高斯函式


上面的正態分佈是一維的,影象都是二維的,所以我們需要二維的正態分佈。

正態分佈的密度函式叫做"高斯函式"(Gaussian function)。它的一維形式是:


其中,μ是x的均值,σ是x的方差。因為計算平均值的時候,中心點就是原點,所以μ等於0。


根據一維高斯函式,可以推導得到二維高斯函式:


有了這個函式 ,就可以計算每個點的權重了。


四、權重矩陣


假定中心點的座標是(0,0),那麼距離它最近的8個點的座標如下:

更遠的點以此類推。


為了計算權重矩陣,需要設定σ的值。假定σ=1.5,則模糊半徑為1的權重矩陣如下:


這9個點的權重總和等於0.4787147,如果只計算這9個點的加權平均,還必須讓它們的權重之和等於1,因此上面9個值還要分別除以0.4787147,得到最終的權重矩陣。

五、計算高斯模糊


有了權重矩陣,就可以計算高斯模糊的值了。


假設現有9個畫素點,灰度值(0-255)如下:

每個點乘以自己的權重值:

得到

將這9個值加起來,就是中心點的高斯模糊的值。


對所有點重複這個過程,就得到了高斯模糊後的影象。如果原圖是彩色圖片,可以對RGB三個通道分別做高斯模糊。


六、邊界點的處理


如果一個點處於邊界,周邊沒有足夠的點,怎麼辦?


一個變通方法,就是把已有的點拷貝到另一面的對應位置,模擬出完整的矩陣。


七、參考文獻


How to program a Gaussian Blur without using 3rd party libraries


推薦閱讀

(點選標題可跳轉閱讀)

詳解 EM 演算法和 高斯混合模型

一文讀懂 KMP 演算法



覺得本文有幫助?請分享給更多人

關注「演算法愛好者」加星標,修煉程式設計內功

好文章,我在看❤️

已同步到看一看



熱點新聞