去霧算法學習-----Automatic recovery of the atmospheric light hazy image(fattal 大氣光值自適應去霧算法)閱讀筆記

IEEE 2014

以色列 希伯來大學 

Matan Sulami     Itamar Glatzer      Raanan Fattal      Mike Werman

作者主頁:http://www.cs.huji.ac.il/~raananf/

 

(1-t(x))A表現爲環境光,A~表示矢量方向=A/||A||。

不精準的A會讓t也不準確,由於t是用A求得的。不正確的A的模會導致術後出圖像在亮度上的錯誤表現。並且這個多通道的偏差取決於t。當A偏大時,t小的地方(近景)會過曝,t大的地方(遠景)會偏暗。而當A偏小時則相反。亮度的偏差依賴於t和圖像的內容。

TAN認爲最亮的像素充滿了霧,是一個有霧區域的像素。

TAREL是基於灰度世界的假設,先對圖像做白平衡,然後用A(1,1,1)進行去霧。

在這個算法中,將去霧分成了兩個部分 1)求取A矢量的方向 2)求取A矢量的模長

 

求取方向A~

在去霧公式中,其中的J又可以表示成這樣,其中l表示圖像的明暗係數,反映亮度是一個標量;R表示圖像表面反射係數,是一個矢量,反映了光的色度,並且||R||=1。

那麼去霧公式可以寫成,其中l(x)表示ti*l’(x),ti表示第i塊內的透射率,Ri是第i塊內的反射率。

由於塊具有局部平滑的特性。假設塊內R和t保持不變。公式(3)可以理解爲一個線性方程。那麼一個塊內的像素RGB會分佈在一條直線上。且根據公式可知,這條線的方向爲R矢量方向,偏移矢量爲A~。

因此,每一個塊的直線與原點形成一個平面,兩個平面的交線就是候選向量。可以使用最少兩個塊或更多塊的交點去恢復A~。

計算第i個塊對應的直線和其對應的第j個候選向量計算最小歐式距離dij。對所有的dij進行排序,選取中值對應的那個塊i。再從塊i中選取其對應的距離dij最小的那個j個候選向量。這就是要求得的A~。用公式表示爲

上圖可以看出,塊內像素分佈並不是完全的分佈在直線上。塊內下像素直線由所有像素的重心和PCA(主成分分析)過後的最大特徵值對應的特徵向量。

爲了防止異常值,首先對塊內所有像素進行一次PCA,計算出直線。然後剔除與直線距離最遠的前20%個像素,再進行第二次PCA。

關於如何尋找符合公式(3)的塊的步驟如下,假設是三個特徵值:

  1. 第一特徵向量是R矢量的方向,所以個座標非負。
  2. 第一特徵值大於閾值,
  3. 爲了使像素能明顯的處於一條直線附近,所以要有一個明確的第一特徵值。
  4. 直線不能穿過原點,且與原點的歐式距離
  5. 由於假設塊內平滑,所以所選的塊不能有邊緣信息,在這裏使用canny提取邊緣信息,包含邊緣像素的塊將被丟棄。

在這一過程中,使用10*10的塊。

關於的設定:首先分別單獨初始化,使步驟2、3、4單獨的每一個步驟能夠找到大於50個塊。然後計算同時滿足2、3、4步驟的塊,若小於10個,則對這三個參數輪流減少3%。直到滿足。

另外,去除角度小於15°的直線對應的塊。

 

 

 

求取模||A||
引入修正因子a。使得式子成立。

上式並不是只有唯一解,但是有一個特解可以成功去霧,(1-ta(x))aA應該與(1-t(x))A相匹配,因爲其反映了環境光。

爲了滿足(4),R和A必須跨越正確的二維子空間,因此任何偏離的大氣光值必須通過t和l來校正,並且t和l是相關的。

那麼(5)中的式子被分解,意味着

因爲只有R定義了線性空間關係(矢量方向),且||R||=||Ra||=1。Ra=R。

因此

所以使用aA作爲大氣光值去霧的結果爲,與的不同之處在於亮度上。

當一個被低估了的aA(即a<1)會導致低t的地方更亮。相反高估了的aA(即a>1)會導致低t的地方更暗。

這些局部的偏差是難以被發現的,因爲它與t是相關的,而t與圖片內容相關。不同物體像素通常對應於相同的表面顏色和深度範圍,因此在t和對象間的邊界對應於J中的邊緣,另外t的不連續是因爲深度的變化。

爲了解決這個問題,基於觀察自然有霧圖像的統計發現一個不變性,其證明如下。

將t的值劃分成不同等級。

該公式表示當t(x)=s的所有像素中,輸出亮度爲第1%個像素的l值。

對於多幅圖像統計計算l*的均值和方差,其結果如下。

發現對應於不同的t和圖像,具有不變性。不同圖片的各個等級的t的第1%個像素的l值基本保持一致。其原因是大體積的物體在圖像中佔據了一個小範圍的t(或者景深)。

在實際操作中使用aA作爲大氣光值去霧後的圖像Ja(x)進行統計

根據式子(5)(6)可以推出。把這個從l*(s)到la*的轉換歸因於錯誤的估計了大氣光值的大小。

由於上面提到的不變性,可以將l*看作一個常數k。最後通過如下式子求得最終的修正因子a。

,並且用matlab中的fminsearch解,初始化a~=1,k=1;

 

 

 

算法步驟:

  1. 篩選符合要求的塊
  2. 兩兩塊平面相交求取候選向量
  3. 從所有候選向量中選取中值對應的塊i。選擇塊i的所有dij距離中的最小值對應候選向量爲A~
  4. 根據A~將其歸一化,使得||A||=1,使用這個作爲大氣光值去霧
  5. 使用方程計算a~
  6. A~/a~作爲正確的大氣光值進行最後的去霧。

 

侷限

  1. 部分圖像不符合l*的不變性,會估計出錯誤的模
  2. 部分圖像找不到滿足要求的足夠多的塊參與候選向量選擇

 

以下效果僅用了算法中的方向的算法,並未使用模長估計,而是使用了自己的算法。

原論文完整matlab代碼在作者的主頁有,可以供下載。

個人不好實驗結果:

A=0.72 0.74 0.42

A=0.96 0.86 0.79

 

個人實驗正確的結果:

A=0.82   0.88  0.92

A=0.75     0.77     0.80

 

在這裏只看整體顏色趨勢,而忽略A的大小。

在我的整體測試圖片中,部分的圖片效果並不好。

原有有二:1、部分圖像估計出來的A的方向就不對。

                 2、模估計大小存在問題,導致圖像增強的幅度過大,最終導致偏色。

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