图像去雾算法(二)基于暗通道先验算法学习笔记
在http://write.blog.csdn.net/postedit/78301999中介紹了圖像去霧的相關研究方法,發現目前為止在圖像去霧方面,何凱明博士基于暗通道先驗的算法具有很好的效果,關于該方法的介紹也很多,本篇作下學習筆記和個人理解:
Retinex背景知識
?
(1)
圖像去霧過程就是根據 I(x) 求解 J(x) 的過程。從上面的公式可以看出,基于物理模型的去霧算法本質是根據已知的有霧圖像 I(x) 求出透射率 t(x) 和全局大氣光成分A (A>0),進而得到復原圖像J(X)(場景光成分)。在參考【2】里有關于該模型的詳細解釋,其中J(x)t(x)是直接衰減(direct attenuation),A(1-t(x)) 是空氣光(airlight)。當大氣是同質(說的應該是均勻分布吧)時,傳輸率t表示為:
?????????????????????????????????????????????????????????? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??? (2)
其中,β是大氣的散射系數,d是場景光線的景深。
有霧圖像特征:
上面幾幅圖是圖像的彩色分布圖和直方圖,一般的,有霧圖像的RGB色彩分布圖比較集中,直方圖范圍也窄,相對集中;清晰圖像的RGB色彩分布圖比較廣泛,直方圖分布均勻,色彩感較強。
基于暗通道先驗去霧算法原理:
下面是原作者的一些感言:
簡單有效的圖像去霧技術
這篇論文研究的問題是圖像的去霧技術,它可以還原圖像的顏色和能見度,同時也能利用霧的濃度來估計物體的距離,這些在計算機視覺上都有重要應用(例如三維重建,物體識別)。但是之前人們還沒找到簡單有效的方法來達到這個目的。在這篇論文里,我們找到了一個非常簡單的,甚至說令人驚訝統計規律,并提出了有效的去霧方法。
與之前的方法不同,我們把注意力放到了無霧圖像的統計特征上。我們發現,在無霧圖像中,每一個局部區域都很有可能會有陰影,或者是純顏色的東西,又或者是黑色的東西。因此,每一個局部區域都很有可能有至少一個顏色通道會有很低的值。我們把這個統計規律叫做Dark Channel Prior。直觀來說,Dark Channel Prior認為每一個局部區域都總有一些很暗的東西。這個規律很簡單,但在我們研究的去霧問題上卻是本質的基本規律。
由于霧總是灰白色的,因此一旦圖像受到霧的影響,那么這些本來應該很暗的東西就會變得灰白。不僅如此,根據物理上霧的形成公式,我們還能根據這些東西的灰白程度來判斷霧的濃度。因此,我們提出的Dark Channel Prior能很有效地去除霧的影響,同時利用物的濃度來估算物體的距離。
大道之行在于簡
我們這篇文章的三個審稿人都給出了最高的評分。他們認為我們的方法簡單而有效。其中一位評委說,Dark Channel Prior的想法聽起來很不可思議,但我們卻證明了其真實性。另一位評委認為很少有文章能夠用如此簡單的方法使實驗結果獲得如此大的提升。還有一位評委甚至親自實現了我們的方法并確認其可行。孫劍說閱讀這樣的評審結果是一件讓人快樂的事情。而湯老師認為,這篇文章的成功在于三個方面。第一,方法非常簡單;第二,對于一個很困難的問題,給出了很好的結果;第三,發現了一個基本的自然規律并且應用在實際的問題中。在邁阿密的演講結束后,觀眾也給予了很高的評價。他們跟我說,這是這次CVPR上最有趣的一個演講。
一位與會的研究員說,最好的idea,往往就是那些看起來很簡單,但說出來大家都會覺得怎么沒有人想到過的idea。而我們的idea正好就符合了這一點。我們論文摘要的第一句話是這么說的,“我們提出了一個簡單而有效的方法”。或許,這就是對我們這次工作最好的概括——簡單的,就是美的。
下面正式展開基于暗通道去霧算法的原理部分:
從上面的式(1)可以看出,A, I, J 三個向量是共面的,并且末端點共線,并可以推出t的表達式(3):
暗通道先驗:
關于暗通道先驗的概念,在作者的感言部分有很清楚的解釋,就不再說了。其求法如下:
??????????????????? (4)
Ω(x)表示以x為中心的局部塊,c為三個通道,Jc表示圖像J的彩色通道圖像。即先求出rgb通道中像素的最小值,然后將其存進和原始圖像尺寸相同的灰度圖中,再對該灰度圖進行最小值濾波。
若 J 是無霧霾圖像,除了天空區域,式(4)的值趨近與0,另外作者給出了暗通道存在的幾個原因:
(1)陰影。比如:在城市景觀中的車輛、建筑物和窗戶內部的陰影;在自然風景中的樹葉、樹木和巖石的陰影。
(2)彩色物體或表面。比如:低反射率彩色通道的物體(如綠草、樹,紅花或葉子,藍色的水面)容易在暗通道產生亮度低的值。
(3)暗的對象或表面。比如:暗的樹和石頭。
由于戶外的圖像通常都有陰影并且色彩斑斕,所以這些圖像的暗通道確實很暗。
?
估計傳輸率 t:
假設大氣光 A 已知,式(1)可以推出:
?
??? , ?? ? ? ? ? ? ? ? ? ? ? ? ? ? ? (5)
進一步假設局部塊Ω(x)是連續的,塊的傳輸率為 t~,式(5)對每個通道去最小值運算,
t~(x)
? , ? (6)
由于式(4)趨近于0,A>0,所以有:
,????????????????????????????????????????????????? (7)
把式(7)帶入(6),得到:
,????????????????????????????????????? (8)
由于天空在無限遠處且傳輸率趨于0,所以式(8)此時也是可以滿足的。同時考慮到大氣透視(aerial perspective)現象的存在,如果完全移除霧霾,圖像看起來會不自然并且可能丟失深度信息,所以需要對遠處的對象保留少量的霧霾,于是在式(8)中引入了恒參w,一般取值為0.95,式(8)變為:
?????????????????????????????????? (9)
?
基于暗通道先驗去霧算法的缺陷:
暗原色先驗是一種統計的結果,是對大量戶外無霧照片的統計結果,如果目標場景內存在和大氣光類似,比如雪地、白色背景墻、大海等,那么由于前提條件就不成立,此時將無法獲得滿意的效果,但是對于一般的風景照片該算法處理效果會不錯。
基于暗通道先驗去霧算法實現:
式(4)求暗通道先驗時,進行兩部取最小值操作,該算法的快速實現可以參見【3】 ,這個算法的時間復雜度是O(1)。后來,作者有針對算法效率進行改進,使用了引導濾波算法,
具體代碼請參見參考附錄里的博客。我這里只附錄下Richal_zhang的matlab實現,她的是按照論文里最基本的實現:
?
%=========================================================% %調用規則:(有霧時調用,否則不調用) %實際操作時,according to experiments: %percent=under_50/total %percent<0.1%,取w=0.6 %percent>0.1%&&percent<1%,取w=0.45 %percenet>1%&&percent<2%,取w=0.3 %else not use haze-free-adjust %有霧:繪制出的直方圖<50的部分<1% %最后控制臺還會輸出原圖中under_50像素點所占比例 %=========================================================% close all clear all clc blockSize=15; %每個block為15個像素 w0=0.6; t0=0.1; % A=200; I=imread('D:\fcq_proMatlab\test_image\fog\5.jpg'); h = figure; %set(gcf,'outerposition',get(0,'screensize'));%獲得SystemScreenSize 傳遞給當前圖像句柄gcf的outerposition屬性 subplot(321)%表示3(行數)*2(列數)的圖像,1代表所畫圖形的序號 imshow(I); title('Original Image'); subplot(323); grayI=rgb2gray(I); imshow(grayI,[]); title('原圖像灰度圖') subplot(324); imhist(grayI,64); %統計<50的像素所占的比例 %%%%%%%%%%%%%%%%%%%%%% [COUNT x]=imhist(grayI); under_50=0; for i=0:50 under_50=under_50+COUNT(x==i); end under_50 total=size(I,1)*size(I,2)*size(I,3); percent=under_50/total; %%%%%%%%%%%%%%%%%%%%%% if(percent>0.02) error('This image need not Haze-Free-Proprocessing.'); else if(percent<0.001) w=0.6; else if (percent>0.01) w=0.3; else w=0.45; end end end [h,w,s]=size(I); min_I=zeros(h,w); for i=1:h for j=1:w dark_I(i,j)=min(I(i,j,:));%取每個點的像素為RGB分量中最低的那個通道的值 end end Max_dark_channel=double(max(max(dark_I))); dark_channel=double(dark_I); t=1-w0*(dark_channel/Max_dark_channel); T=uint8(t*255); t=max(t,t0); %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% I1=double(I); J(:,:,1) = uint8((I1(:,:,1) - (1-t)*Max_dark_channel)./t); J(:,:,2) = uint8((I1(:,:,2) - (1-t)*Max_dark_channel)./t); J(:,:,3) =uint8((I1(:,:,3) - (1-t)*Max_dark_channel)./t); subplot(322) imshow(J); title('Haze-Free Image:'); subplot(325); grayJ=rgb2gray(J); imshow(grayJ,[]); title('去霧后灰度圖') subplot(326); imhist(grayJ,64);?
?
?
參考:
- 《圖像去霧的最新研究進展》[J]. 自動化學報
- 《Visibility in Bad Weather from a Single Image》[J].IEEE
- 《STREAMING MAXIMUM-MINIMUM FILTER USING NO MORE THAN THREE COMPARISONS PER ELEMENT》
- http://qianjiye.de/2015/09/haze-removal-kaiming#outline_0
- http://blog.csdn.net/u011691310/article/details/16827695
- http://blog.csdn.net/baimafujinji/article/details/27206237
- http://blog.csdn.net/baimafujinji/article/details/30060161
- http://www.cnblogs.com/Imageshop/p/3281703.html
- http://blog.csdn.net/s12244315/article/details/50292049
- https://www.cnblogs.com/hansjorn/p/5571390.html
總結
以上是生活随笔為你收集整理的图像去雾算法(二)基于暗通道先验算法学习笔记的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 通过java获取抖音用户主页信息(202
- 下一篇: Spring Boot项目自定义启动Ba