避免影象去霧演算法中讓天空部分出現過增強的一種簡易方法。

Imageshop發表於2014-08-12

      在經典的幾種去霧演算法中,包括何凱明的暗通道去霧、Tarel的基於中值濾波的去霧以及一些基於其他邊緣保留的方法中,都有一個普遍存在的問題:即對天空部分處理的不好,天空往往會出現較大的面積的紋理及分塊現象。究其主要原因,還是因為天空部位基本上是不符合暗通道去霧先驗這個前決條件的。目前,針對這一問題,我搜尋到的主要有以下幾篇文章進行了處理:

1、 改進的基於暗原色先驗的影象去霧演算法 作者: 蔣建國\侯天峰\齊美彬   合肥工業大學 2011

      2、Single image dehazing Algorithms based on sky region segmentation, 2013  王廣義  哈爾濱工業大學(這篇文章似乎要到學校裡才能下載);

      第一篇文章增加了一個可控引數K, 用來調節每個畫素處的透射率:

 

           

 

      當|I(x)-A|<k時,認為這個區域可能是天空,重新計算透射率(增加透射率),|I(x)-A|>k處,則認為是符合暗通道先驗的區域,透射率不變。

      如果K取值為0,則相當於原始的透射率公式。

      上面的做法是較為合理的,因為一般情況下大氣光A的取值和天空部分應該是非常接近的,而那些符合暗通道的地方則遠離天空,關於這個演算法的效果,我在我的《Single Image Haze Removal Using Dark Channel Prior》一文中影象去霧演算法的原理、實現、效果(速度可實時)一文的例項工程中已經提供了測試程式。

       第二篇文章的思路則是進行天空分割。對分割後的兩部分透射率做不同的處理,那麼這個的重點就在於天空特徵的提取。作者原文是通過以下幾個步驟來實現的。

     

     

 

     

  對這幾個步驟我進行了粗陋的點評吧。

      第一步我認為最有價值,直接在原始資料判斷天空不是很好做,作者觀察到天空部分整體來說是比較平滑的,也就是相鄰畫素之間變化不大,因此用梯度來表示則更容易識別,梯度值越小則表明影象那一塊越光滑。

      第二步則設定一個閾值來初步判斷某處是否屬於天空,這個閾值作者取的是0.02,量化到unsigned char範圍則基本對應5。

      第三步對初步的邊界進行下小範圍的擴充套件。

      第四步對分割後的圖的每個聯通區域統計其原始影象在對應位置的畫素的平均亮度,如果大於閾值T則保留,T這裡作者取0.81,對應整數205左右。

      第五步取符合第四步條件的最大的聯通區域作為識別的天空區域。

      第六步是為了防止一些漏檢點,把在天空區域周邊的一些畫素在進一步進行識別,符合條件的則加到天空區域中。

      第七步是一些被完整包含在天空中還未被認為是天空的小區域新增到天空中。

     個人認為,除了第一步、第二步、第四步有必要外,其他的不需要這樣處理。特別是第五步的處理會造成天空部位的漏檢。比如下面的流程示意圖的原圖,如果用上述方式肯定會造成左上角處小部分天空完全丟失掉。另外一個問題就是,聯通區域的計算還是比較耗時的。

     我的做法是: 

     1、將影象轉換為灰度:這裡為保留更多的邊緣資訊,可以考慮使用具有對比度保留功能或顯著性保留功能的一些去色演算法。

     2、求灰度影象的梯度資訊(其實就可以用常用的一些邊緣檢測運算元實現);

     3、對梯度資訊進行適當的去噪和濾波;

     4、按照設定梯度閾值和亮度閾值對梯度資訊進行區分;

     5、對區分後的圖進行高斯羽化處理(可選的)。

    整個流程的示意圖如下所示:

   

              原圖                                    灰度圖                                  梯度資訊

  

            稍作去噪                                 初步天空識別                                      進行羽化

      作為對比,我們在給出幾幅圖的天空的識別效果:

      

     

 對於那些基本不存在天空的圖,檢測的結果如下:

     

  一片黑,因此,完全不影響結果。

      得到天空區域後,原文作者將天空區域的透射率圖統一的設定成了一個固定值,我認為這樣不好,還是應該根據具體的值做適當的修正。 在我上述的操作中,得到的天空去區域是一副蒙版圖,某個點並不一定是完全屬於天空或完全不屬於。因此,我就可以根據這個值來+ 暗通道求得的值進行一下Alpha混合,如下所示:

  DarkChannel[Y]= (SkyPresrve * Sky[Y] + DarkChannel[Y] * (255 - Sky[Y])) / 255 ;    

  其中SkyPresrve就類似於論文的固定透射率值,是使用者指定的,在上式中,若Sky[255],即完全屬於天空,則改點的透射率即為固定值,若Sky[Y]=0,即完全不屬於天空,計算式的值不變,不影響正常去霧。

      另外關於大氣光值A的計算,論文提出了以獲得的天空部位的畫素的平均值作為A,這也是非常合理的,但是在實際處理時,針對有些完全沒有天空部分的影象,可能檢測到的天空區域很小(明顯屬於誤檢,但是程式不知道的),這個時候以此為大氣光值,也是不合理的。為此,我的處理方式先計算天空部位計算的A值,然後在檢測天空畫素佔整個影象的比例,如果比例小於5%,則還是以何凱明那種計算A的方式進行。

      還有一步,論文也提到了,就是這些校正的步驟都必須在refine階段之前做,簡單的說,就是需要在進行導向濾波前做。這樣利用導向濾波的平滑功能,可以將天空和非天空分界部位的不平滑現象一定程度上彌補掉);

  為了提高速度,也可以採用我在何那篇論文的分析的博文中的方式,進行下采樣處理,然後在上取樣。

      作為對比,我們給出直接用何的方式實現的效果和用天空識別方式處理的對比效果:

     

        

        

        

        

               原圖                                    何的去霧                             本文結果(SkyPresrve =100)

  有以上比較可見,在保護了天空的時候,和天空交接的地方的去霧程度也適當的有所減弱。

   在論文的最後,作者也提到了去霧的影象顯得比較昏暗,為此,做了一下處理:

        

  即在HSV空間,對V分量進行CLAHE增強,然後在轉換到RGB空間,這種方式對有些影象確實有很明顯的增強效果,但是有些圖可能又會增強噪音,因此還是根據實際情況選擇性的處理吧。

  示例程式:http://files.cnblogs.com/Imageshop/HazeRemovalWithSkyRecognition.rar

   

 

****************************作者: laviewpbt   時間: 2014.8.12    聯絡QQ:  33184777 轉載請保留本行資訊**********************

  

相關文章