Bilateral Filtering(双边滤波) for SSAO
1. 簡(jiǎn)介
圖像平滑是一個(gè)重要的操作,而且有多種成熟的算法。這里主要簡(jiǎn)單介紹一下Bilateral方法(雙邊濾波),這主要是由于前段時(shí)間做了SSAO,需要用bilateral blur 算法進(jìn)行降噪。Bilateral blur相對(duì)于傳統(tǒng)的高斯blur來(lái)說(shuō)很重要的一個(gè)特性即可可以保持邊緣(Edge Perseving),這個(gè)特點(diǎn)對(duì)于一些圖像模糊來(lái)說(shuō)很有用。一般的高斯模糊在進(jìn)行采樣時(shí)主要考慮了像素間的空間距離關(guān)系,但是卻并沒(méi)有考慮像素值之間的相似程度,因此這樣我們得到的模糊結(jié)果通常是整張圖片一團(tuán)模糊。Bilateral blur的改進(jìn)就在于在采樣時(shí)不僅考慮像素在空間距離上的關(guān)系,同時(shí)加入了像素間的相似程度考慮,因而可以保持原始圖像的大體分塊進(jìn)而保持邊緣。在于游戲引擎的post blur算法中,bilateral blur常常被用到,比如對(duì)SSAO的降噪。
2. 原理
濾波算法中,目標(biāo)點(diǎn)上的像素值通常是由其所在位置上的周?chē)囊粋€(gè)小局部鄰居像素的值所決定。在2D高斯濾波中的具體實(shí)現(xiàn)就是對(duì)周?chē)囊欢ǚ秶鷥?nèi)的像素值分別賦以不同的高斯權(quán)重值,并在加權(quán)平均后得到當(dāng)前點(diǎn)的最終結(jié)果。而這里的高斯權(quán)重因子是利用兩個(gè)像素之間的空間距離(在圖像中為2D)關(guān)系來(lái)生成。通過(guò)高斯分布的曲線可以發(fā)現(xiàn),離目標(biāo)像素越近的點(diǎn)對(duì)最終結(jié)果的貢獻(xiàn)越大,反之則越小。其公式化的描述一般如下所述:
其中的c即為基于空間距離的高斯權(quán)重,而用來(lái)對(duì)結(jié)果進(jìn)行單位化。
高斯濾波在低通濾波算法中有不錯(cuò)的表現(xiàn),但是其卻有另外一個(gè)問(wèn)題,那就是只考慮了像素間的空間位置上的關(guān)系,因此濾波的結(jié)果會(huì)丟失邊緣的信息。這里的邊緣主要是指圖像中主要的不同顏色區(qū)域(比如藍(lán)色的天空,黑色的頭發(fā)等),而B(niǎo)ilateral就是在Gaussian blur中加入了另外的一個(gè)權(quán)重分部來(lái)解決這一問(wèn)題。Bilateral濾波中對(duì)于邊緣的保持通過(guò)下述表達(dá)式來(lái)實(shí)現(xiàn):
其中的s為基于像素間相似程度的高斯權(quán)重,同樣用來(lái)對(duì)結(jié)果進(jìn)行單位化。對(duì)兩者進(jìn)行結(jié)合即可以得到基于空間距離、相似程度綜合考量的Bilateral濾波:
上式中的單位化分部綜合了兩種高斯權(quán)重于一起而得到,其中的c與s計(jì)算可以詳細(xì)描述如下:
且有
且有
上述給出的表達(dá)式均是在空間上的無(wú)限積分,而在像素化的圖像中當(dāng)然無(wú)法這么做,而且也沒(méi)必要如此做,因而在使用前需要對(duì)其進(jìn)行離散化。而且也不需要對(duì)于每個(gè)局部像素從整張圖像上進(jìn)行加權(quán)操作,距離超過(guò)一定程度的像素實(shí)際上對(duì)當(dāng)前的目標(biāo)像素影響很小,可以忽略的。限定局部子區(qū)域后的離散化公就可以簡(jiǎn)化為如下形式:
上述理論公式就構(gòu)成了Bilateral濾波實(shí)現(xiàn)的基礎(chǔ)。為了直觀地了解高斯濾波與雙邊濾波的區(qū)別,我們可以從下列圖示中看出依據(jù)。假設(shè)目標(biāo)源圖像為下述左右區(qū)域分明的帶有噪聲的圖像(由程序自動(dòng)生成),藍(lán)色框的中心即為目標(biāo)像素所在的位置,那么當(dāng)前像素處所對(duì)應(yīng)的高斯權(quán)重與雙邊權(quán)重因子3D可視化后的形狀如后邊兩圖所示:????????????
左圖為原始的噪聲圖像;中間為高斯采樣的權(quán)重;右圖為Bilateral采樣的權(quán)重。從圖中可以看出Bilateral加入了相似程度分部以后可以將源圖像左側(cè)那些跟當(dāng)前像素差值過(guò)大的點(diǎn)給濾去,這樣就很好地保持了邊緣。為了更加形象地觀察兩者間的區(qū)別,使用Matlab將該圖在兩種不同方式下的高度圖3D繪制出來(lái),如下:
??
上述三圖從左到右依次為:雙邊濾波,原始圖像,高斯濾波。從高度圖中可以明顯看出Bilateral和Gaussian兩種方法的區(qū)別,前者較好地保持了邊緣處的梯度,而在高斯濾波中,由于其在邊緣處的變化是線性的,因而就使用連累的梯度呈現(xiàn)出漸變的狀態(tài),而這表現(xiàn)在圖像中的話就是邊界的丟失(圖像的示例可見(jiàn)于后述)。??????????????????????????????????????????????
3. 代碼實(shí)現(xiàn)
有了上述理論以后實(shí)現(xiàn)Bilateral Filter就比較簡(jiǎn)單了,其實(shí)它也與普通的Gaussian Blur沒(méi)有太大的區(qū)別。這里主要包括3部分的操作: 基于空間距離的權(quán)重因子生成;基于相似度的權(quán)重因子的生成;最終filter顏色的計(jì)算。
3.1 Spatial Weight
這就是通常的Gaussian Blur中使用的計(jì)算高斯權(quán)重的方法,其主要通過(guò)兩個(gè)pixel之間的距離并使用如下公式計(jì)算而來(lái):
其中的就表示兩個(gè)像素間的距離,比如當(dāng)前像素與其右邊緊鄰的一個(gè)像素之間的距離我們就可以用來(lái)計(jì)算,也即兩個(gè)二維向量{0 , 0}以及{0 , 1}之間的歐氏距離。直接計(jì)算一個(gè)區(qū)域上的高斯權(quán)重并單位化后就可以進(jìn)行高斯模糊了。
3.2 Similarity Weight
與基于距離的高斯權(quán)重計(jì)算類似,只不過(guò)此處不再根據(jù)兩個(gè)pixel之間的空間距離,而是根據(jù)其相似程度(或者兩個(gè)pixel的值之間的距離)。
其中的表示兩個(gè)像素值之間的距離,可以直接使用其灰度值之間的差值或者RGB向量之間的歐氏距離。
3.3 Color Filtering
有了上述兩部分所必需的權(quán)重因子之后,那么具體的雙邊濾波的實(shí)現(xiàn)即與普通的高斯濾波無(wú)異。主要部分代碼如下述:
[cpp]?view plain?copy?其中的相似度分部的權(quán)重s主要根據(jù)兩個(gè)Pixel之間的顏色差值計(jì)算面來(lái)。對(duì)于灰度圖而言,這個(gè)差值的范圍是可以預(yù)知的,即[-255, 255],因而為了提高計(jì)算的效率我們可以將該部分權(quán)重因子預(yù)計(jì)算生成并存表,在使用時(shí)快速查詢即可。使用上述實(shí)現(xiàn)的算法對(duì)幾張帶有噪聲的圖像進(jìn)行濾波后的結(jié)果如下所示:
???
????
上圖從左到右分別為:雙邊濾波;原始圖像;高斯濾波。從圖片中可以較為明顯地看出兩種算法的區(qū)別,最直觀的感受差別就是使用高斯算法后整張圖片都是一團(tuán)模糊的狀態(tài);而雙邊濾波則可以較好地保持原始圖像中的區(qū)域信息,看起來(lái)仍然嘴是嘴、眼是眼(特別是在第一張美女圖像上的效果!看來(lái)PS是灰常重要啊~~^o^)。
4. 在SSAO中的使用
在上述實(shí)現(xiàn)中的邊緣判定函數(shù)主要是通過(guò)兩個(gè)像素值之間的差異來(lái)決定,這也是我們觀察普通圖片的一種普遍感知方式。當(dāng)然,也可以根據(jù)使用的需求情況來(lái)使用其它的方式判斷其它定義下的邊緣,比如使用場(chǎng)景的depth或是normal。比如在對(duì)SSAO進(jìn)行濾波時(shí)可以直接使用Depth值來(lái)行邊緣判斷。首先,設(shè)置一個(gè)深度的閾值,在作邊緣檢測(cè)時(shí)比較兩點(diǎn)間的depth差值,如果差值大于閾值,則認(rèn)為其屬于不同的區(qū)域,則此處就應(yīng)為邊界。使用此方法得到的效果可見(jiàn)于下圖所示:
高斯濾波
雙邊濾波
在得到濾波之后的SSAO圖像之后,與原始圖像進(jìn)行直接的整合就可以得到最終的渲染效果,如下圖所示:
SSAO關(guān)閉
SSAO開(kāi)啟
?
后記: 嶄新的2012年自己以一篇博文開(kāi)始,感覺(jué)也不錯(cuò),加油~!~!
總結(jié)
以上是生活随笔為你收集整理的Bilateral Filtering(双边滤波) for SSAO的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: Android URL
- 下一篇: Joint Bilateral Filt