学习何凯明《Single Image Haze Removal Using Dark Channel Prior》一文的总结(高清无码)。
由于CSDN博客和博客園的編輯方面有不一致的地方,導(dǎo)致文中部分圖片錯(cuò)位,為不影響瀏覽效果,建議點(diǎn)擊打開鏈接。
在圖像去霧這個(gè)領(lǐng)域,幾乎沒(méi)有人不知道《Single Image Haze Removal Using Dark Channel Prior》這篇文章,該文是2009年CVPR最佳論文。作者何凱明博士,2007年清華大學(xué)畢業(yè),2011年香港中文大學(xué)博士畢業(yè),可謂是功力深厚,感嘆于國(guó)內(nèi)一些所謂博士的水平,何這樣的博士才可以真正叫做Doctor。
關(guān)于何博士的一些資料和論文,大家可以訪問(wèn)這里:http://research.microsoft.com/en-us/um/people/kahe/
最開始接觸何的這篇論文是在2011年,說(shuō)實(shí)在的那個(gè)時(shí)候,只是隨便瀏覽了下,看到里面的soft matting過(guò)程比較復(fù)雜,并且執(zhí)行速度非常慢,就沒(méi)有什么大的興趣。最近又偶爾拾起,仔細(xì)研讀,覺(jué)得論文的推理步驟特別清晰,講解很到位。恰好適逢瀏覽到其另外一篇文章《Guided Image Filtering》,其中提到了可以用導(dǎo)向?yàn)V波來(lái)代替soft matting的過(guò)程,且速度很快,因此,我對(duì)去霧的興趣算法又大大提高了。
本文主要上是對(duì)《Single Image Haze Removal Using Dark Channel Prior》的翻譯、整理、及部分解釋。如果您的英文水平好,建議看原文可能來(lái)的更爽些。
一、論文思想的簡(jiǎn)單描述
首先看看暗通道先驗(yàn)是什么:
在絕大多數(shù)非天空的局部區(qū)域里,某一些像素總會(huì)有至少一個(gè)顏色通道具有很低的值。換言之,該區(qū)域光強(qiáng)度的最小值是個(gè)很小的數(shù)。
我們給暗通道一個(gè)數(shù)學(xué)定義,對(duì)于任意的輸入圖像J,其暗通道可以用下式表達(dá):
式中Jc表示彩色圖像的每個(gè)通道,Ω(x)表示以像素X為中心的一個(gè)窗口。
式(5)的意義用代碼表達(dá)也很簡(jiǎn)單,首先求出每個(gè)像素RGB分量中的最小值,存入一副和原始圖像大小相同的灰度圖中,然后再對(duì)這幅灰度圖進(jìn)行最小值濾波,濾波的半徑由窗口大小決定,一般有WindowSize = 2*Radius + 1;
暗通道先驗(yàn)的理論指出:
實(shí)際生活中造成暗原色中低通道值主要有三個(gè)因素:a)汽車、建筑物和城市中玻璃窗戶的陰影,或者是樹葉、樹與巖石等自然景觀的投影;b)色彩鮮艷的物體或表面,在RGB的三個(gè)通道中有些通道的值很低(比如綠色的草地/樹/植物,紅色或黃色的花朵/葉子,或者藍(lán)色的水面);c)顏色較暗的物體或者表面,例如灰暗色的樹干和石頭。總之,自然景物中到處都是陰影或者彩色,這些景物的圖像的暗原色總是很灰暗的。
我們拋開論文中列舉的那些例子,自己從網(wǎng)上找?guī)追鶝](méi)有霧的風(fēng)景照,看看結(jié)果如下:
一些無(wú)霧的圖片 其暗通道
在看看一些有霧的圖的暗通道:
一些有霧的圖片 其暗通道
上述暗通道圖像均使用的窗口大小為15*15,即最小值濾波的半徑為7像素。
由上述幾幅圖像,可以明顯的看到暗通道先驗(yàn)理論的普遍性。在作者的論文中,統(tǒng)計(jì)了5000多副圖像的特征,也都基本符合這個(gè)先驗(yàn),因此,我們可以認(rèn)為其實(shí)一條定理。
有了這個(gè)先驗(yàn),接著就需要進(jìn)行一些數(shù)學(xué)方面的推導(dǎo)來(lái)最終解決問(wèn)題。
首先,在計(jì)算機(jī)視覺(jué)和計(jì)算機(jī)圖形中,下述方程所描述的霧圖形成模型被廣泛使用:
其中,I(X)就是我們現(xiàn)在已經(jīng)有的圖像(待去霧的圖像),J(x)是我們要恢復(fù)的無(wú)霧的圖像,A是全球大氣光成分, t(x)為透射率。現(xiàn)在的已知條件就是I(X),要求目標(biāo)值J(x),顯然,這是個(gè)有無(wú)數(shù)解的方程,因此,就需要一些先驗(yàn)了。
將式(1)稍作處理,變形為下式:
如上所述,上標(biāo)C表示R/G/B三個(gè)通道的意思。
首先假設(shè)在每一個(gè)窗口內(nèi)透射率t(x)為常數(shù),定義他為,并且A值已經(jīng)給定,然后對(duì)式(7)兩邊求兩次最小值運(yùn)算,得到下式:
上式中,J是待求的無(wú)霧的圖像,根據(jù)前述的暗原色先驗(yàn)理論有:
因此,可推導(dǎo)出:
把式(10)帶入式(8)中,得到:
這就是透射率的預(yù)估值。
在現(xiàn)實(shí)生活中,即使是晴天白云,空氣中也存在著一些顆粒,因此,看遠(yuǎn)處的物體還是能感覺(jué)到霧的影響,另外,霧的存在讓人類感到景深的存在,因此,有必要在去霧的時(shí)候保留一定程度的霧,這可以通過(guò)在式(11)中引入一個(gè)在[0,1] 之間的因子,則式(11)修正為:
本文中所有的測(cè)試結(jié)果依賴于: ω=0.95。
上述推論中都是假設(shè)全球達(dá)氣光A值時(shí)已知的,在實(shí)際中,我們可以借助于暗通道圖來(lái)從有霧圖像中獲取該值。具體步驟如下:
1) 從暗通道圖中按照亮度的大小取前0.1%的像素。
2) 在這些位置中,在原始有霧圖像I中尋找對(duì)應(yīng)的具有最高亮度的點(diǎn)的值,作為A值。
到這一步,我們就可以進(jìn)行無(wú)霧圖像的恢復(fù)了。由式(1)可知:J =( I - A)/t + A
現(xiàn)在I,A,t都已經(jīng)求得了,因此,完全可以進(jìn)行J的計(jì)算。
當(dāng)投射圖t 的值很小時(shí),會(huì)導(dǎo)致J的值偏大,從而使淂圖像整體向白場(chǎng)過(guò)度,因此一般可設(shè)置一閾值T0,當(dāng)t值小于T0時(shí),令t=T0,本文中所有效果圖均以T0=0.1為標(biāo)準(zhǔn)計(jì)算。
因此,最終的恢復(fù)公式如下:
當(dāng)直接用上述理論進(jìn)行恢復(fù)時(shí),去霧的效果其實(shí)也是很明顯的,比如下面一些例子:
有霧圖 去霧圖
注意到第一幅圖的原圖兩個(gè)字的周圍明顯有一塊不協(xié)調(diào)的地方,而第二圖頂部水平方向似乎有一塊沒(méi)有進(jìn)行去霧處理,這些都是由于我們的透射率圖過(guò)于粗糙了。
要獲得更為精細(xì)的透射率圖,何博士在文章中提出了了soft matting方法,能得到非常細(xì)膩的結(jié)果。但是他的一個(gè)致命的弱點(diǎn)就是速度特慢,不使用于實(shí)際使用。在2011年,何博士又除了一片論文,其中提到了導(dǎo)向?yàn)V波的方式來(lái)獲得較好的透射率圖。該方法的主要過(guò)程集中于簡(jiǎn)單的方框模糊,而方框模糊有多重和半徑無(wú)關(guān)的快速算法。因此,算法的實(shí)用性特強(qiáng),關(guān)于這個(gè)導(dǎo)向?yàn)V波算法大家在何博士的網(wǎng)站可以自己去研習(xí)下,除了在去霧方面外,還有著其他多方面的應(yīng)用,這部分本文不多述。
使用了導(dǎo)向?yàn)V波后的去霧效果:
使用原始的預(yù)估透射率圖 使用導(dǎo)向?yàn)V波后的透射率圖
(a) 原圖 (b) 去霧結(jié)果圖
(c) 暗通道圖 (d) 導(dǎo)向圖 (原始圖像的灰度圖)
(e) 預(yù)估透射率圖 (f)使用導(dǎo)向?yàn)V波后的透射率圖
二、各參數(shù)對(duì)去霧結(jié)果的影響
第一:窗口的大小。這個(gè)對(duì)結(jié)果來(lái)說(shuō)是個(gè)關(guān)鍵的參數(shù),窗口越大,其包含暗通道的概率越大,暗通道也就越黑。我們不去從理論角度分析,從實(shí)踐的效果來(lái)看,似乎窗口越大,去霧的效果越不明顯,如下圖所示:
(a) 原始圖像 (b) 窗口大小=11
(c) 窗口大小=21 (d) 窗口大小=101
我的建議是窗口大小在11-51之間,即半徑在5-25之間。
式(12)中的ω具有著明顯的意義,其值越小,去霧效果越不明顯,舉例如下:
(a) 原始圖像 (b) ω=0.5
(c) ω=0.8 (d) ω=1
三:編碼的步驟
如果你仔細(xì)的分析了原文的細(xì)路,加上適當(dāng)?shù)膮⒖迹幋a其實(shí)并不是很困難。
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算法的快速實(shí)現(xiàn),提供一篇論文供有需要的朋友學(xué)習(xí):STREAMING MAXIMUM-MINIMUM FILTER USING NO MORE THAN THREE COMPARISONS PER ELEMENT。這個(gè)算法的時(shí)間復(fù)雜度是O(1)的。
2)按文中所描述的算法自動(dòng)獲得全球大氣光的值。
這里說(shuō)明一點(diǎn),原始論文中的A最終是取原始像素中的某一個(gè)點(diǎn)的像素,我實(shí)際上是取的符合條件的所有點(diǎn)的平均值作為A的值,我這樣做是因?yàn)椋绻侨∫粋€(gè)點(diǎn),則各通道的A值很有可能全部很接近255,這樣的話會(huì)造成處理后的圖像偏色和出現(xiàn)大量色斑。原文作者說(shuō)這個(gè)算法對(duì)天空部分不需特備處理,我實(shí)際發(fā)現(xiàn)該算法對(duì)有天空的圖像的效果一般都不好。天空會(huì)出現(xiàn)明顯的過(guò)渡區(qū)域。作為解決方案,我增加了一個(gè)參數(shù),最大全球大氣光值,當(dāng)計(jì)算的值大于該值時(shí),則就取該值。
原圖 未對(duì)A值做限定 最大A值限定為220
3) 按式(12)計(jì)算預(yù)估的透射率圖。
在式(12)中,每個(gè)通道的數(shù)據(jù)都需要除以對(duì)應(yīng)的A值,即歸一化,這樣做,還存在一個(gè)問(wèn)題,由于A的選取過(guò)程,并不能保證每個(gè)像素分量值除以A值后都小于1,從而導(dǎo)致t的值可能小于0,而這是不容許的,原文作者并沒(méi)有交代這一點(diǎn)是如何處理的。我在實(shí)際的編碼中發(fā)現(xiàn),如果真的這樣做了,其效果也并不是很理想,因此,我最后的辦法是在式(12)中,不考慮A的計(jì)算。
4)計(jì)算導(dǎo)向?yàn)V波圖。
這里可以直接用原始的圖像的灰度圖做導(dǎo)向圖,計(jì)算很簡(jiǎn)單。
5)按照《Guided Image Filtering》論文中的公式(5)、(6)、(8)編碼計(jì)算獲得精細(xì)的透射率圖。
網(wǎng)絡(luò)上有這個(gè)算法的 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
由上面的代碼,可見,主要的工作量在均值模糊上,而均值模糊是個(gè)很快速的算法,關(guān)于均值模糊的優(yōu)化可參考我以前的文章:彩色圖像高速模糊之懶惰算法。
還有一點(diǎn)就是,上述計(jì)算需要在[0,1]范圍內(nèi)進(jìn)行,也就是說(shuō)導(dǎo)向圖和預(yù)估的透射率圖都必須從[0,255]先映射到[0,1]在進(jìn)行計(jì)算。
6)按式(22)進(jìn)行無(wú)霧圖像的恢復(fù)。
四、去霧的效果
原圖 去霧效果圖 透射率圖
在原文中,有這樣一段話:
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.
意思就是說(shuō)直接去霧后的圖像會(huì)比原始的暗,因此在處理完后需要進(jìn)行一定的曝光增強(qiáng),但作者沒(méi)有說(shuō)明其是如何增強(qiáng)的, 因此,這里的圖和他論文的效果有所不同時(shí)正常的。一般在去霧處理后再用自動(dòng)色劑之類的算法增強(qiáng)下會(huì)獲得比較滿意的結(jié)果,如下圖:
原圖 去霧后 +自動(dòng)色劑
去霧算法目前也有著眾多其他的方式,不過(guò)我所接觸的,很多都是以這個(gè)位基礎(chǔ),因此,先弄回這個(gè)為研究其他的去霧算法能奠定堅(jiān)實(shí)的基礎(chǔ)。
網(wǎng)絡(luò)上有一些比較好的暗原色先驗(yàn)去霧的matlab代碼:比如和本文基本對(duì)應(yīng)的matlab資源:http://files.cnblogs.com/Imageshop/cvpr09defog%28matlab%29.rar
和平常一樣,提供一個(gè)可供大家測(cè)試效果的程序: 基于暗原色先驗(yàn)的圖像去霧演示程序
我分別用VB6和C#做了個(gè)程序,兩個(gè)程序都已經(jīng)通過(guò)各自的語(yǔ)言方式進(jìn)行了優(yōu)化,算法部分編碼是一樣的,C#運(yùn)行速度大約是VB6的1.8倍。
在處理速度上,比 matalb的快了很多倍,在I3的筆記本電腦上,一副1024*768的圖像去霧時(shí)間大約在160ms內(nèi)。
*****************************基本上我不提供源代碼,但是我會(huì)盡量用文字把對(duì)應(yīng)的算法描述清楚或提供參考文檔****************
*******************************因?yàn)榭孔约旱呐蛯?shí)踐寫出來(lái)的效果才真正是自己的東西,人一定要靠自己****************************
***************************作者: laviewpbt 時(shí)間: 2013.8.23聯(lián)系QQ: 33184777 轉(zhuǎn)載請(qǐng)保留本行信息************************
總結(jié)
以上是生活随笔為你收集整理的学习何凯明《Single Image Haze Removal Using Dark Channel Prior》一文的总结(高清无码)。的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 奥斯特发现了什么现象
- 下一篇: 守株待兔全文翻译