UnityShader - 屏幕特效 - 高斯模糊(Gaussian Blur)

高斯模糊(Gaussian Blur)

概述

在電子世界中常常會接觸到高斯模糊,它常出現在圖像處理的軟件裏,只是你們不知道它的名字而已。接觸過photoshop的同學一定對它不陌生,在這些同學的印像裏就是一種效果不錯的模糊方式。從數學的角度來看,圖像的高斯模糊過程就是圖像與正態分佈做卷積,由於正態分佈又叫做高斯分佈,所以這項技術又叫做高斯模糊。

“高斯” 爲什麼前面帶有這麼洋氣的名字。因爲這種模糊的方式與一個叫高斯數學方程有關。沒錯,和一般的數學定理命名方式一樣,高斯是它的命名者。他的名字叫Johann Carl Friedrich Gauss,是一位德國的數學家,當然他還有其它的頭銜,有興趣可以看這裏

模糊算法,不論是使用哪種算法,目的都是爲了讓圖片看起來不如原來那麼清晰。清晰的圖片,像素間的過渡會較爲乾脆利落,簡而言之,就是像素之間的差距比較大。
而模糊的本質,其實就是使用某種算法把圖像像素和像素之間的差距縮小,讓中間點和周圍點變得差不多;即,讓中間點取一個範圍內的平均值。

原理

高斯模糊和均值模糊一樣,也是取每個像素以及周邊像素的平均值,只不過高斯模糊在取值是離原像素越遠的像素權重越低,而均值模糊則所有像素的權重相等,因此從計算量上來說,採用相同階數的高斯模糊計算量要比均值模糊要大,但是模糊效果要更好,由於沒有明顯的邊界,不會出現均值模糊會出現的方塊化效果。高斯模糊的權重計算時根據正態分佈來計算的,它在N維空間的正態分佈方程爲:

一維高斯分佈,即正態分佈曲線,形狀大概如下圖:
一維正態分佈
圖片來源:http://zh.wikipedia.org/wiki/File:Standard_deviation_diagram.svg
- 二維函數G(x,y),其中r是模糊半徑(r²=x²+y²):

G(x,y)=12πσ2ex2+y22σ2

其對應的圖像爲:
這裏寫圖片描述
從圖像我們也可以看出,正態分佈是一種很不錯的權重分佈方式;計算平均值的時候,我們只需將中心點作爲原點,其他點按照其在正態曲線上的位置,分配權重,就可以得到一個加權平均值。下面還有當σ有取不同值時的曲線圖像,從圖可知,當σ越小時,曲線越高越尖,當σ越大時,曲線就越低越平緩,對應的結果就是圖像越模糊。
這裏寫圖片描述
在實際應用中,如果只是針對圖像進行預處理(如photoshop的高斯濾鏡),可以比較精確的使用高斯函數(雖然也有優化如把二維計算轉化成一維計算),權重都會隨着模糊半徑變化而變化,因此對應的結果也是最精確的,效果也比較好,而在遊戲開發中,因爲考慮到實時處理,效率優先一般會採用近似的高斯模板,優化效率。

遊戲中對高斯模糊的優化

在遊戲中裏的模糊通常都是近似高斯模糊,只要保證權重採樣是一條類似高斯模糊的鐘形曲線就行,即從中心到邊緣是平滑漸變的。一般來說對高斯模糊優化有幾點:

  • 降低階數:降低採樣的階數,比如5階的濾波器就比7階的濾波器效率高,實際上一般不超過7階。
  • 迭代計算:採用低階採樣的同時,可以將進行迭代計算,就是把用上一次的模糊結果,再進行同樣的採樣模糊,以達到更好的效果。在上一篇均值模糊的文章裏也採用了這種方式。
  • 固定權重:權重預先計算好,並且歸一化固定下來,不在遊戲過程中實時計算。
  • 降維計算:因爲高斯模糊在二維圖像上是線性可分的,可以二維計算拆分正兩次一維計算。具體就是先在水平方向做一維高斯矩陣變換後,將其結果再進行垂直方向的一維高斯矩陣變換。從下圖來看對於一個9階的二維運算來說,需要9X9=81次採樣,但是如果拆分成一維運算的話,只需要9+9=18次採樣,只不過需要緩存第一次計算的結果,以空間換時間還是划算的,也可以得出階數越高,效率相差也越大的結論。
    這裏寫圖片描述

shader代碼實現

總結

從圖可以看出本例的效果比之前的均值模糊效果要好太多,之所以有這樣的結果,主要是因爲本例圖像濾波器的採樣階數達到了7階,相當於每個像素採樣了49個頂點(但只花了14次採樣,不包括迭代),而上篇只是一個3階的縮水版的圖像濾波器(實際只採樣了四次,不包括迭代),因此效果差也成了必然,實際上在移動平臺上,如果要求不太高,可以將7階採樣降爲5階就足夠了,取消掉迭代,效果也可以達到上篇均值模糊的效果,甚至還要稍微好一些,而且計算量相差無幾,,一個14次採樣,一個8次(迭代了兩次)採樣,而drawcall可以降到3次。本例也不是嚴格的高斯模糊,只能算是近似高斯模糊,實際上,權重曲線我們也可以換成其他的曲線,,只要按照離原像素越遠,權重越低的原則即可,爲了效率經常會使用一些近似權重矩陣採樣計算,如:

1/16121242121

1/651232123432345432343212321

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