從最開始的Crimm Imageshop中最簡單的去霧功能開始,到前不久為止研究的諸多去霧算法,再到近日和一些朋友的關於去霧經驗的交流,感覺自己對這個方面的研究已經止步了,現對這些算法做個簡單的總結。
本博客中共給出了6種有去霧功能的算法:
(2)基於中值濾波(也可使用高斯\均值\雙邊之類的)的去霧;
其中前三種算法屬於基於去霧物理模型的,后三種屬於普通圖像增強手段。
我們先說說后三種吧。基於Retinex的算法對於整體偏暗的圖像有很好的增強作用,用於去霧方面只可用於靜態的圖像,原因有:(1) MSRCR是基於多次高斯模糊的,里面有很多的浮點計算,速度是個瓶頸;(2)對於有霧圖,有可能會出現過增強現象,使的圖像出現噪點;(3)對於本身比較正常的圖,處理后的效果人的視覺看來很不自然。
第5和第6種算法i是傳統的增強算法,對於圖像整體特征比較單一的圖去霧的效果還是相當明顯的,但是這兩個算法受參數的影響比較大,特別是取樣數或者說是Tile的大小,不同的Tile會造成局部圖像的過增強(偏白或偏黑),並且算法的復雜度也比較高,內部的分塊處理也不適合於並行處理,嚴重限制了其在實時去霧方面的應用。
第2種基於中值濾波的方式在一些論文里也時有提到,實際我用高斯或者均值之類的模糊代替高斯,也有一定的去霧能力,如果是用中值,可能還會出現圖像周邊有明顯的分界效果,如下圖所示,注意看建築物頂部的幾個角的位置:
還有個問題就是雖然有快速的中值算法,但是考慮到現在的工業應用場合常見的處理大小,實時性還是難以保證,因此,我認為這個算法也只有停留在紙面上,創造不了使用價值。
第3篇算法提出的實時算法,其核心就是一個boxblur,約占整個過程耗時一半左右,但確實能做到實時的能力。對於單幅圖像的去霧效果也是相當的不錯的,但是用於連續的視頻流去霧似乎能發現各幀之間的過渡不是特別的自然。
在來說說何凱明的去霧算法吧,我現在看來,還是這個算法最穩定、最可靠。一是這個算法的原理性經得起推敲,二是其效果綜合來說要比其他的算法都為好,特別是用於連續的視頻流。我認為這主要還是得益於其透射率圖要比其他的都為精細。你如果看看中值或者那個實時的,就可以知道他們對應的透射率圖都很粗糙。 不過何的算法有一個致命的弱點,速度很慢,因為無論是用soft matting或者guide filter都有着大量的浮點運算,這嚴重的限制了其用於工業CCD的實時處理。
鑒於此,作者也試着對代碼進行深層次的優化,包括SSE處理、並行運行等,但由於算法本身的順序執行,無法全程並行,偶爾一個小函數可以並行,但由於其本身執行就特別快,比如不要5ms,你去用並行算法可能耗時還會大一些。因此,一直沒有什么大的進步,對於一副1024*768的彩圖進行去霧需要90ms,這肯定無法滿足需求。
最近,在思考,既然暗通道去霧的透射率圖比其他的算法都來的精細,如果適當的降低一點點其精度,其去霧的效果理論上應該不會有太大的區別,於是我想到了一種方式,即求取透射率的時候不是對原圖進行求取,而是先對原圖進行下采樣,比如縮小為原圖的1/4,計算出小圖的透射率,之后在通過插值的方式的獲取原圖大概的透射率,則應該也可以獲得效果。經過實踐,這種方式大大的提高了執行速度,而且效果和原始的方案基本一致,對於1024*768的圖像大約只需要30ms了,如果進一步取1/9的縮放,則只需要大約20ms,完全可以滿足工業實時性要求高的場合。
當然,如果你的縮小系數不是特別大的話,比如縮小為原來的0.5大小,可能兩次縮放所用的耗時還抵消了計算小圖的透射率圖所換來的盈利,因此必須合理選擇這個下采樣率。
去霧還有一些其他人做的論文,比較經典比如有fattal論文:Single Image Dehazing
Jean-Philippe Tarel: Fast Visibility Restoration from a Single Color or Gray Level Image
最新的比如2013年的 Gaofeng MENG: Efficient Image Dehazing with Boundary Constraint and Contextual Regularization (國產的)
有興趣的朋友可以自己去研究研究。
我做了一個程序,集成了上述6種圖像去霧的算法: 圖像去霧綜合版本
*********************************作者: laviewpbt 時間: 2014.1.12 聯系QQ: 33184777 轉載請保留本行信息************************