自從何凱明提出導(dǎo)向?yàn)V波后,因?yàn)槠渌惴ǖ暮唵涡院陀行?,該算法得到了廣泛的應(yīng)用,以至于新版的matlab都將其作為標(biāo)準(zhǔn)自帶的函數(shù)之一了,利用他可以解決的所有的保邊濾波器的能解決的問題,比如細(xì)節(jié)增強(qiáng)、HDR壓縮、細(xì)節(jié)羽化、去霧、風(fēng)格化,而且由于其保邊特性,如果很多傳統(tǒng)函數(shù)中使用高斯濾波或者均值濾波的地方用他代替,能很好解決一些強(qiáng)邊緣的過渡不自然問題,比如retinex、Highlight/shadow等應(yīng)用中,因此,快速的實(shí)現(xiàn)該算法具有很強(qiáng)的適用意義。

  本文簡要的記錄了本人在優(yōu)化導(dǎo)向?yàn)V波實(shí)現(xiàn)的過程中所適用的優(yōu)化方式和一些細(xì)節(jié),以免時(shí)間久了后自己都不記得了,但是請不要向我直接索取源代碼。

      自認(rèn)為目前我優(yōu)化的速度在CPU版本中很難有人能超越了(僅僅使用CPU、不用多線程,下采樣率0.2),如果誰有更快的算法,在第三方公證的情況下,我愿意提供1000元獎(jiǎng)勵(lì)^_^。

      何凱明在導(dǎo)向?yàn)V波一文的相關(guān)資料中提供了其matlab代碼,或者用下面的流程也可以清晰的表達(dá):

移動開發(fā)培訓(xùn),Android培訓(xùn),安卓培訓(xùn),手機(jī)開發(fā)培訓(xùn),手機(jī)維修培訓(xùn),手機(jī)軟件培訓(xùn)

  我們看到了上面的6次取mean計(jì)算的過程,也就是浮點(diǎn)數(shù)的boxfilter,這個(gè)東西已經(jīng)是老掉牙的一個(gè)算法了,我在幾年前研究過opencv內(nèi)部的這個(gè)算法,并且提出了一種比opencv實(shí)現(xiàn)更快的方法,詳見解析opencv中Box Filter的實(shí)現(xiàn)并提出進(jìn)一步加速的方案(源碼共享) 一文。不過那里的處理時(shí)針對字節(jié)數(shù)據(jù)的,其內(nèi)部用到了一些整形數(shù)據(jù)的SSE優(yōu)化,如果原始數(shù)據(jù)是浮點(diǎn)數(shù),那反而就更為簡易了,因?yàn)镾SE指令生來就是為浮點(diǎn)數(shù)服務(wù)的。

      但是即使是這樣,由于6次計(jì)算以及中間的其他一些浮點(diǎn)運(yùn)算,依然給整個(gè)算法帶來了很大的運(yùn)算開銷和內(nèi)存開銷,在很多場合還是無法滿足需求的,比如實(shí)時(shí)去霧等場景。在早期我的快速去霧實(shí)現(xiàn)中,都是先利用下采樣圖的導(dǎo)向?yàn)V波結(jié)果,然后再雙線性插值放大得到大圖的透射率圖,雖然在視覺效果上能解決去霧算法的速度問題,但是如果是其他場景的導(dǎo)向?yàn)V波需求,還是會看到很多瑕疵的。

      何凱明在2015又發(fā)表了一篇《Fast Guided Filter》的文章,闡述了一種很實(shí)用的更快速的導(dǎo)向?yàn)V波流程:

移動開發(fā)培訓(xùn),Android培訓(xùn),安卓培訓(xùn),手機(jī)開發(fā)培訓(xùn),手機(jī)維修培訓(xùn),手機(jī)軟件培訓(xùn)

     我剛剛提的在去霧中我實(shí)用的小Trick實(shí)際上就是第六步及第七步不同,我的方式可表達(dá)如下:

       6: q = meana. * + mean<

網(wǎng)友評論