图像去雾,何凯明
轉(zhuǎn)載地址:https://www.cnblogs.com/Imageshop/p/3281703.html
在圖像去霧這個領(lǐng)域,幾乎沒有人不知道《Single Image Haze Removal Using Dark Channel Prior》這篇文章,該文是2009年CVPR最佳論文。作者何凱明博士,2007年清華大學(xué)畢業(yè),2011年香港中文大學(xué)博士畢業(yè),可謂是功力深厚,感嘆于國內(nèi)一些所謂博士的水平,何這樣的博士才可以真正叫做Doctor。
???? 關(guān)于何博士的一些資料和論文,大家可以訪問這里:http://research.microsoft.com/en-us/um/people/kahe/
???? 最開始接觸何的這篇論文是在2011年,說實在的那個時候,只是隨便瀏覽了下,看到里面的soft matting過程比較復(fù)雜,并且執(zhí)行速度非常慢,就沒有什么大的興趣。最近又偶爾拾起,仔細研讀,覺得論文的推理步驟特別清晰,講解很到位。恰好適逢瀏覽到其另外一篇文章《Guided Image Filtering》?,其中提到了可以用導(dǎo)向濾波來代替soft matting的過程,且速度很快,因此,我對去霧的興趣算法又大大提高了。 ?
???? 本文主要上是對《Single Image Haze Removal Using Dark Channel Prior》的翻譯、整理、及部分解釋。如果您的英文水平好,建議看原文可能來的更爽些。
????一、論文思想的簡單描述?
?????首先看看暗通道先驗是什么:
? ?? 在絕大多數(shù)非天空的局部區(qū)域里,某一些像素總會有至少一個顏色通道具有很低的值。換言之,該區(qū)域光強度的最小值是個很小的數(shù)。
我們給暗通道一個數(shù)學(xué)定義,對于任意的輸入圖像J,其暗通道可以用下式表達:
????????????????????????????????????
??????式中Jc表示彩色圖像的每個通道?,Ω(x)表示以像素X為中心的一個窗口。?
?? 式(5)的意義用代碼表達也很簡單,首先求出每個像素RGB分量中的最小值,存入一副和原始圖像大小相同的灰度圖中,然后再對這幅灰度圖進行最小值濾波,濾波的半徑由窗口大小決定,一般有WindowSize = 2?*?Radius + 1;??????????
??????暗通道先驗的理論指出:
????????????????????????????????????????????????????????? ?????????????
?????實際生活中造成暗原色中低通道值主要有三個因素:a)汽車、建筑物和城市中玻璃窗戶的陰影,或者是樹葉、樹與巖石等自然景觀的投影;b)色彩鮮艷的物體或表面,在RGB的三個通道中有些通道的值很低(比如綠色的草地/樹/植物,紅色或黃色的花朵/葉子,或者藍色的水面);c)顏色較暗的物體或者表面,例如灰暗色的樹干和石頭。總之,自然景物中到處都是陰影或者彩色,這些景物的圖像的暗原色總是很灰暗的。
????? 我們拋開論文中列舉的那些例子,自己從網(wǎng)上找?guī)追鶝]有霧的風(fēng)景照,看看結(jié)果如下:
???? ???
????????
????????
???????????? ???? 一些無霧的圖片??????????????????????????????????????????????????????????????????????????????? ? 其暗通道
在看看一些有霧的圖的暗通道:
??????
??????
一些有霧的圖片?????????????????????????????????????????????????????????????????????????????? ???其暗通道
上述暗通道圖像均使用的窗口大小為15*15,即最小值濾波的半徑為7像素。
????? 由上述幾幅圖像,可以明顯的看到暗通道先驗理論的普遍性。在作者的論文中,統(tǒng)計了5000多副圖像的特征,也都基本符合這個先驗,因此,我們可以認為其實一條定理。
????? 有了這個先驗,接著就需要進行一些數(shù)學(xué)方面的推導(dǎo)來最終解決問題。
首先,在計算機視覺和計算機圖形中,下述方程所描述的霧圖形成模型被廣泛使用:
???????????????????????????????????????????????? ??
? 其中,I(X)就是我們現(xiàn)在已經(jīng)有的圖像(待去霧的圖像),J(x)是我們要恢復(fù)的無霧的圖像,A是全球大氣光成分, t(x)為透射率。現(xiàn)在的已知條件就是I(X),要求目標值J(x),顯然,這是個有無數(shù)解的方程,因此,就需要一些先驗了。
將式(1)稍作處理,變形為下式:
????????????????????????????????????????????????? ??
??? 如上所述,上標C表示R/G/B三個通道的意思。
??? 首先假設(shè)在每一個窗口內(nèi)透射率t(x)為常數(shù),定義他為,并且A值已經(jīng)給定,然后對式(7)兩邊求兩次最小值運算,得到下式:
??????????????????????????????? ??
??? 上式中,J是待求的無霧的圖像,根據(jù)前述的暗原色先驗理論有:
???????????????????????????????????????????????
???? 因此,可推導(dǎo)出:
????????????????????????????????????????????????????? ???
??? 把式(10)帶入式(8)中,得到:
?????????????????????????????????????????????????
????這就是透射率的預(yù)估值。
??? 在現(xiàn)實生活中,即使是晴天白云,空氣中也存在著一些顆粒,因此,看遠處的物體還是能感覺到霧的影響,另外,霧的存在讓人類感到景深的存在,因此,有必要在去霧的時候保留一定程度的霧,這可以通過在式(11)中引入一個在[0,1] 之間的因子,則式(11)修正為:
?????????????????????????????????????????? ????
???? 本文中所有的測試結(jié)果依賴于:? ω=0.95。
???? 上述推論中都是假設(shè)全球達氣光A值時已知的,在實際中,我們可以借助于暗通道圖來從有霧圖像中獲取該值。具體步驟如下:
??? 1) 從暗通道圖中按照亮度的大小取前0.1%的像素。
????????? 2) 在這些位置中,在原始有霧圖像I中尋找對應(yīng)的具有最高亮度的點的值,作為A值。
???? 到這一步,我們就可以進行無霧圖像的恢復(fù)了。由式(1)可知:??J =?( I - A)/t + A??
?????現(xiàn)在I,A,t都已經(jīng)求得了,因此,完全可以進行J的計算。
???? 當投射圖t 的值很小時,會導(dǎo)致J的值偏大,從而使淂圖像整體向白場過度,因此一般可設(shè)置一閾值T0,當t值小于T0時,令t=T0,本文中所有效果圖均以T0=0.1為標準計算。
???? 因此,最終的恢復(fù)公式如下:
?????????????????????????????
???? 當直接用上述理論進行恢復(fù)時,去霧的效果其實也是很明顯的,比如下面一些例子:
???????
????? ?
?????? 有霧圖 ??????????????? 去霧圖
??????注意到第一幅圖的原圖兩個字的周圍明顯有一塊不協(xié)調(diào)的地方,而第二圖頂部水平方向似乎有一塊沒有進行去霧處理,這些都是由于我們的透射率圖過于粗糙了。
????? 要獲得更為精細的透射率圖,何博士在文章中提出了了soft matting方法,能得到非常細膩的結(jié)果。但是他的一個致命的弱點就是速度特慢,不使用于實際使用。在2011年,何博士又除了一片論文,其中提到了導(dǎo)向濾波的方式來獲得較好的透射率圖。該方法的主要過程集中于簡單的方框模糊,而方框模糊有多重和半徑無關(guān)的快速算法。因此,算法的實用性特強,關(guān)于這個導(dǎo)向濾波算法大家在何博士的網(wǎng)站可以自己去研習(xí)下,除了在去霧方面外,還有著其他多方面的應(yīng)用,這部分本文不多述。
???? 使用了導(dǎo)向濾波后的去霧效果:
?????
??????
??? 使用原始的預(yù)估透射率圖 ?????????? ?使用導(dǎo)向濾波后的透射率圖
??????
?? (a) 原圖 ??? (b) 去霧結(jié)果圖
??????
?????? ?(c)??? 暗通道圖 (d) 導(dǎo)向圖 (原始圖像的灰度圖)
???? ?
????????? (e)? ?預(yù)估透射率圖 (f)???使用導(dǎo)向濾波后的透射率圖
二、各參數(shù)對去霧結(jié)果的影響
?第一:窗口的大小。這個對結(jié)果來說是個關(guān)鍵的參數(shù),窗口越大,其包含暗通道的概率越大,暗通道也就越黑。我們不去從理論角度分析,從實踐的效果來看,似乎窗口越大,去霧的效果越不明顯,如下圖所示:
?????? ?
?????????????????????????? ?(a) 原始圖像? (b) 窗口大小=11
??????
?(c) 窗口大小=21 (d) 窗口大小=101?
我的建議是窗口大小在11-51之間,即半徑在5-25之間。
???? 式(12)中的ω具有著明顯的意義,其值越小,去霧效果越不明顯,舉例如下:
??????
??????????????????????????????????? (a) 原始圖像? ??? ?? (b)??? ω=0.5?????????
??????????
? ?????????????????????????????????????(c)??? ω=0.8?????????????????????????????????????????????????????????????????? ?? (d)??? ω=1?
????三:編碼的步驟
如果你仔細的分析了原文的細路,加上適當?shù)膮⒖?#xff0c;編碼其實并不是很困難。
1)根據(jù)原始圖像求暗通道,參考代碼如下:
for (Y = 0, DarkPt = DarkChannel; Y < Height; Y++){ImgPt = Scan0 + Y * Stride;for (X = 0; X < Width; X++){Min = *ImgPt;if (Min > *(ImgPt + 1)) Min = *(ImgPt + 1);if (Min > *(ImgPt + 2)) Min = *(ImgPt + 2);*DarkPt = Min;ImgPt += 3;DarkPt++;}}MinFilter(DarkChannel, Width, Height, Radius);????這里需要注意的是MinFilter算法的快速實現(xiàn),提供一篇論文供有需要的朋友學(xué)習(xí):STREAMING MAXIMUM-MINIMUM FILTER USING NO MORE THAN THREE COMPARISONS PER ELEMENT?。這個算法的時間復(fù)雜度是O(1)的。
????? 2)按文中所描述的算法自動獲得全球大氣光的值。
?????這里說明一點,原始論文中的A最終是取原始像素中的某一個點的像素,我實際上是取的符合條件的所有點的平均值作為A的值,我這樣做是因為,如果是取一個點,則各通道的A值很有可能全部很接近255,這樣的話會造成處理后的圖像偏色和出現(xiàn)大量色斑。原文作者說這個算法對天空部分不需特備處理,我實際發(fā)現(xiàn)該算法對有天空的圖像的效果一般都不好。天空會出現(xiàn)明顯的過渡區(qū)域。作為解決方案,我增加了一個參數(shù),最大全球大氣光值,當計算的值大于該值時,則就取該值。?
??? ???? ?
??????????????????????? 原圖???????????????????????????????????????????????????????? 未對A值做限定 最大A值限定為220
?????? 3) 按式(12)計算預(yù)估的透射率圖。
在式(12)中,每個通道的數(shù)據(jù)都需要除以對應(yīng)的A值,即歸一化,這樣做,還存在一個問題,由于A的選取過程,并不能保證每個像素分量值除以A值后都小于1,從而導(dǎo)致t的值可能小于0,而這是不容許的,原文作者并沒有交代這一點是如何處理的。我在實際的編碼中發(fā)現(xiàn),如果真的這樣做了,其效果也并不是很理想?,因此,我最后的辦法是在式(12)中,不考慮A的計算。
??????? 4)計算導(dǎo)向濾波圖。
這里可以直接用原始的圖像做導(dǎo)向圖,當然也可以用其灰度圖,但是用RGB導(dǎo)向圖在下一步的計算中會占用比較大的時間。
??????? 5)按照《Guided Image Filtering》論文中的公式(5)、(6)、(8)編碼計算獲得精細的透射率圖。
網(wǎng)絡(luò)上有這個算法的 matlab代碼可下載的,這里貼部分代碼:
function q = guidedfilter(I, p, r, eps)% GUIDEDFILTER O(1) time implementation of guided filter.%% - guidance image: I (should be a gray-scale/single channel image)% - filtering input image: p (should be a gray-scale/single channel image)% - local window radius: r% - regularization parameter: eps[hei, wid] = size(I);N = boxfilter(ones(hei, wid), r); % the size of each local patch; N=(2r+1)^2 except for boundary pixels.% imwrite(uint8(N), 'N.jpg');% figure,imshow(N,[]),title('N');mean_I = boxfilter(I, r) ./ N;mean_p = boxfilter(p, r) ./ N;mean_Ip = boxfilter(I.*p, r) ./ N;cov_Ip = mean_Ip - mean_I .* mean_p; % this is the covariance of (I, p) in each local patch.mean_II = boxfilter(I.*I, r) ./ N;var_I = mean_II - mean_I .* mean_I;a = cov_Ip ./ (var_I + eps); % Eqn. (5) in the paper;b = mean_p - a .* mean_I; % Eqn. (6) in the paper;mean_a = boxfilter(a, r) ./ N;mean_b = boxfilter(b, r) ./ N;q = mean_a .* I + mean_b; % Eqn. (8) in the paper;end?????? 由上面的代碼,可見,主要的工作量在均值模糊上,而均值模糊是個很快速的算法,關(guān)于均值模糊的優(yōu)化可參考我以前的文章:彩色圖像高速模糊之懶惰算法。
??????還有一點就是,上述計算需要在[0,1]范圍內(nèi)進行,也就是說導(dǎo)向圖和預(yù)估的透射率圖都必須從[0,255]先映射到[0,1]在進行計算。
????? 關(guān)于guidedfilter中的半徑r值,因為在前面進行最小值后暗通道的圖像成一塊一塊的,為了使透射率圖更加精細,建議這個r的取值不小于進行最小值濾波的半徑的4倍,如下圖所示:
?????? ??
(a)? r=最小值濾波半徑的2倍 (b) r=最小值濾波半徑的8倍
??????可以看到,當r比較小的時候,在透射率圖中基本看不到什么細節(jié)信息,因此恢復(fù)處的圖像邊緣處不明顯。
????? 參數(shù)eps的取值也有所講究,他主要是為了防止計算中除以0的錯誤以及為了使得某些計算結(jié)果不至于過大,一般建議取值0.001或者更小。
????? 如果使用的彩色RGB圖做導(dǎo)向圖,計算時間上會增加不少,所的到的透射率圖的邊緣會比灰度圖所處理的保留了更多的細節(jié),效果上略微比灰度圖好,如下所示:
??????? ?
(a) 原圖??????????????????????????????????????????????????????????????????????????????? ??? (b)預(yù)估的透射率圖
?? ??????
??????????????????? ?? (c)使用灰度圖為導(dǎo)向圖得到的透射率圖 ?????? ??? (d)使用RGB圖為導(dǎo)向圖得到的透射率圖
?????????
???? (e)灰度圖為導(dǎo)向圖對應(yīng)的去霧效果???? ??????? (f)RGB圖導(dǎo)向圖對應(yīng)的去霧效果
???????以RGB圖為導(dǎo)向圖的計算中,涉及到3*3部分矩陣求逆的過程,如果用非matlab語言寫,可以先借助于matlab的符號計算功能,以及其中的符號計算命令simple,把計算結(jié)果算出來,然后再再其他高級語言中實現(xiàn)。
?? ?? ?(6) 按式(22)進行無霧圖像的恢復(fù)。
?四、其他一些去霧效果圖
??????
????? ????
? ????????
????? ????
????????????????????????????? 原圖???????????????????????????????????????????????? 去霧效果圖????????????????????????????????????????????????????? 透射率圖
??????上圖中最后一副圖我連續(xù)做了兩次去霧的處理。?
????? 在原文中,有這樣一段話:
?Since the scene radiance is usually not as bright as the atmospheric light, the image after haze removal looks dim. So we increase the exposure of J(x) for
display.
?????意思就是說直接去霧后的圖像會比原始的暗,因此在處理完后需要進行一定的曝光增強,但作者沒有說明其是如何增強的, 因此,這里的圖和他論文的效果有所不同時正常的。一般在去霧處理后再用自動色劑之類的算法增強下會獲得比較滿意的結(jié)果,如下圖:
?????? ????? ?
??? 原圖 ? 去霧后 +自動色階
????? 去霧算法目前也有著眾多其他的方式,不過我所接觸的,很多都是以這個為基礎(chǔ),因此,先弄會這個為研究其他的去霧算法能奠定堅實的基礎(chǔ)。
??????網(wǎng)絡(luò)上有一些比較好的暗原色先驗去霧的matlab代碼:比如和本文基本對應(yīng)的matlab資源:http://files.cnblogs.com/Imageshop/cvpr09defog%28matlab%29.rar
后記:稍微有看了幾篇去霧的文章,基本上都是圍繞著獲得透視率圖做文章,比如一些文章講用聯(lián)合雙邊濾波方式獲得精細的透射率,從我個人淺薄的認識中,我覺得去霧已基本上跳不出暗原色這個范疇了。
????? 我對雙邊濾波算法那也做了實驗,發(fā)現(xiàn)這個的效果也還行,就是速度慢了很多,雙邊濾波的快速算法其實快不起來的,所以這個的實用性不高,我選擇了一些圖像做比較:
?????????
? ???????????????????????? ?? (a) 原圖?????????????????????????????????????????????????????????????? (b)?? 聯(lián)合雙邊濾波去霧圖
?????????
? ???????????????????? (c) 導(dǎo)向濾波獲得透射率圖?????????????????????????????????????????????????? (d)聯(lián)合雙邊濾波透射率圖(Sigmad=SigmaR=100)
???????上圖可以很明顯的看出聯(lián)合雙邊濾波的透射率圖沒有導(dǎo)向濾波的精細,但比原始的粗糙的透射率圖還是好很多,過渡很光滑,因此,也能獲得不錯的視覺去霧效果。
?????? 聯(lián)合雙邊濾波器中的算法是參考了OpenCv中相關(guān)函數(shù)寫的。
?????和平常一樣,提供一個可供大家測試效果的程序:?基于暗原色先驗的圖像去霧演示程序
????
??? 我分別用VB6和C#做了個程序,兩個程序都已經(jīng)通過各自的語言方式進行了優(yōu)化,算法部分編碼是一樣的,C#運行速度大約是VB6的1.8倍。
????在處理速度上,比 matalb的快了很多倍,在I3的筆記本電腦上,一副1024*768的圖像去霧時間大約在150ms內(nèi)(以灰度圖為導(dǎo)向圖)。
????后記補充修正:在后續(xù)對該算法的關(guān)注中,發(fā)現(xiàn)自己在前面做出了一個錯誤的判斷,就是關(guān)于式(11)中/A的操作。我在前面說這個除法會引起一些問題,因此,去除了這一步。但是后來的實踐證明正是有了這一步,對于對比度低的圖像才可以獲得很好的去霧高對比度圖。
????前面說的/A操作可能會導(dǎo)致t的值小于0,這種情況就可以把t的值直接設(shè)置為0來解決。
??? 還有一個事情就是式(11)嚴格的來說是要對原始圖像的每個通道進行歸一化后,再取每個通道R/G/B值的最小值得到中間圖,然后對這個中間圖進行指定半徑的最小值濾波后,通過11式得到粗糙的透射率圖,那么這樣就需要多不少計算,我在實際中發(fā)現(xiàn)如果直接用前面的暗通道圖/A進行操作,兩者的效果區(qū)別不明顯,因此,可用這種簡便的方式。
???
?上圖是一副經(jīng)典的測試圖,雖然取得了比較好的效果,不過似乎馬路那一塊的效果不如一些其他人公開的成果那么好。
???
?????這也是一副比較常見的測試圖,該圖也是緊用去霧獲得結(jié)果,未做任何的后處理,同CSDN一個的案例庫:圖像去霧的算法研究中的效果相比,在整幅圖像的對比和和協(xié)調(diào)性上都要好一個檔次。
???? 再如下圖,也比CSDN那個案例庫中的效果要好很多。
?????
???? 還有:
??
??
????總結(jié):我對這種去霧算法的效果還是很滿意的,?效果和速度都還比較合適。
??? 附件的測試程序已經(jīng)同步更新。
?
導(dǎo)向濾波的相關(guān)資料:
?
另外,代碼里我們使用了導(dǎo)向濾波函數(shù),導(dǎo)向濾波代碼來自何愷明博士,讀者可以訪問他的網(wǎng)頁獲得源碼,已經(jīng)論文的原文,鏈接如下:
http://research.microsoft.com/en-us/um/people/kahe/
另外,下面這個博客里有一些關(guān)于導(dǎo)向濾波的比較通俗的討論,可以作為閱讀論文原文時的輔助材料:
http://blog.inet198.cn/?aichipmunk/article/details/20704681
??
?
總結(jié)
- 上一篇: 图像恢复
- 下一篇: k-means聚类分割