1.簡介。
嚴格的來說,去霧也是對比度增強的一種。但是用常見的對比度增強以及直方圖均衡的算法根本達不到良好的效果。這方面最近比較好的工作就是He kaiming等提出的Dark Channel方法。這篇論文也獲得了2009的CVPR最佳論文獎。
文章標題: single Image Haze Removal Using Dark Channel Prior。
2. 暗通道先驗的理解
從論文的公式1可以看出,去霧模型和圖像摳圖在代數方程上是一致的。
簡單的說,有霧氣的圖像I是由清晰圖像J與大氣光幕A的alpha混合,混合方程如下:
I = alpha * J + A * (1 - alpha)
從上述方程看出,我們在僅僅知道I的前提下,要得到J,這是一個有無窮多個解的問題。
事實上,圖像處理的很多問題都是這樣,當被規約為簡單代數方程之后,都有無窮多個解。
如果我們找到一些對方程中變量的先驗分布,則可能得出方程的唯一解。He kaiming等
通過對大量清晰無霧圖像的統計發現這樣一個事實:
在圖像的一個小的區域,至少有一個通道的最小值趨向於零。
而圖像中有霧的區域,並不滿足這一規律。這個規律就是暗通道先驗。
根據這一規律,He kaiming等推導了求解透射率的公式。
簡單的說,透射率,其實就是上述方程中的 1- alpha,這個分量。
3. 優化透射率。
作者采用暗通道求反,得到透射率的初步估計。然后,作者根據摳圖模型的一篇經典文獻:
A Closed Form solution to Nature Image Matting
中采用的方法,逐步求精,優化透射率,消除了透射率的塊效應。而對大氣光幕的估計,
作者也給出了簡單的思路,即直接取暗通道的最大值的99.5%。
事實上,網上已經有matlab代碼,但是在求取透射率的時候,沒有優化透射率,
所以網上的matlab代碼去霧效果與作者的效果相差甚遠。
4. 時間復雜度。
算法的效果雖然比以往的算法好很多,但是計算時間很慢。尤其是在優化透射率這一步,
對於640x480的圖像,其報道的時間是需要2-3秒的時間。由於去霧是基於快的,其patch
大小為15x15.所以其時間復雜度為O(15*15*M*N)。
5. 其它基於暗通道先驗DCP的改進算法。
5.1 基於中值濾波的改進算法(MDCP)
算法效果一般,時間復雜度為O(log(N)),分塊並行處理之后可以達到實時。
5.2 基於半求反semi-inverse的快速去霧算法, SIGGRAPH ASIA2010
算法非常簡單,能夠有效監測霧的區域並有效去霧,已達到實時的要求。
5.3 基於雙邊濾波的改進算法
這類算法基本上是咱們大陸的同胞搞的,網上有好幾篇這方面的文獻。由於雙邊濾波有O(1)時間的快速算法,所以理論上
這類算法比He kaiming的要快很多倍。但是文獻中基於雙邊濾波的算法都要執行兩次雙邊濾波,所以實際上沒沒有想象中的快。
6. 我的改進方案。
根據其他人改進方案的思路都在優化透射率這一步上使用快速算法,我的改進也是在這一步。我采用一種快速的邊緣保持濾波算法,而這種算法只需要執行一次就可以了。當然,這種邊緣保持濾波器完全可以用任意一種邊緣保持濾波器取代,例如雙邊濾波。
經過上述改進之后,計算時間的瓶頸在最小值濾波求取暗通道這一步之上,而我經過參數選取,圖像patch的大小為3x3而不在是15x15的快。這樣最小值濾波的時間小了很多,而基於快的統計指標計算可以把時間復雜度由平方項降為線性時間復雜度。
經過上述兩項的算法優化,我的浮點代碼在普通PC I3機器上處理一張640x480的彩色圖像的時間小於50ms。
7. 實測圖片效果