避免图像去雾算法中让天空部分出现过增强的一种简易方法
FROM:http://www.chawenti.com/articles/25193.html
在經典的幾種去霧算法中,包括何凱明的暗通道去霧、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 轉載請保留本行信息**********************
??
本文鏈接:避免圖像去霧算法中讓天空部分出現過增強的一種簡易方法。,轉載請注明。
總結
以上是生活随笔為你收集整理的避免图像去雾算法中让天空部分出现过增强的一种简易方法的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 图像边缘检测技术与理论发展脉络梳理大放送
- 下一篇: BRIEF 特征描述子