圖像去霧的算法歷史與綜述
1. 前言
其實之前對圖像去霧也沒有什么深入的理解,只是了解,實現過一些傳統的圖像去霧方法而已。個人感覺,在CNN模型大流行的今天,已經有很多人忽略了傳統算法的發展,以至於你今天去搜索10年前的傳統去霧算法或許根本找不到相關資料了,或許這就是網絡中的圍城吧。今天周六有空來整理一下我所了解到的圖像去霧技術的發展,並嘗試做一個詳細點的綜述。
2. 概述
圖像去霧在計算機視覺中雖然不像目標檢測,語義分割這種任務整天會放在台面上說,但實際上也有大量的研究人員在不斷的研究新方法攻克這一充滿挑戰性的問題。具體來說,圖像去霧算法大致可以分為下面這幾類。
基於圖像增強的去霧算法。基於圖像增強的去霧算法出發點是盡量去除圖像噪聲,提高圖像對比度,從而恢復出無霧清晰圖像。代表性方法有:直方圖均衡化(HLE)、自適應直方圖均衡化(AHE)、限制對比度自適應直方圖均衡化(CLAHE) 、Retinex算法、小波變換、同態濾波 等等。
基於圖像復原的去霧算法。這一系列方法基本是基於大氣退化模型,進行響應的去霧處理。代表性算法有:來自何凱明博士的暗通道去霧算法(CVPR 2009最佳論文)、基於導向濾波的暗通道去霧算法、Fattal的單幅圖像去霧算法(Single image dehazing) 、Tan的單一圖像去霧算法(Visibility in bad weather from a single image) 、Tarel的快速圖像恢復算法(Fast visibility restoration from a single color or gray level image) 、貝葉斯去霧算法(Single image defogging by multiscale depth fusion) ,基於大氣退化模型的去霧效果普遍好於基於圖像增強的去霧算法,后面挑選的傳統去霧算法例子也大多是基於圖像復原的去霧算法。
基於深度學習的去霧算法。由於CNN近年在一些任務上取得了較大的進展,去霧算法自然也有大量基於CNN的相關工作。這類方法是主要可以分為兩類,第一類仍然是於大氣退化模型,利用神經網絡對模型中的參數進行估計,早期的方法大多數是基於這種思想。第二類則是利用輸入的有霧圖像,直接輸出得到去霧后的圖像,也即是深度學習中常說的end2end。
3. 霧天退化模型
我們后面介紹的一些經典算法例子大多基於霧天退化模型,因此有必要在這里將它講清楚。
在計算機視覺領域,通常使用霧天圖像退化模型來描述霧霾等惡劣天氣條件對圖像造成的影響,該模型是McCartney首先提出。該模型包括衰減模型和環境光模型兩部分。模型表達式為:
其中,是圖像像素的空間坐標,是觀察到的有霧圖像,是待恢復的無霧圖像,表示大氣散射系數,代表景物深度,是全局大氣光,通常情況下假設為全局常量,與空間坐標無關。
公式(1)中的表示坐標空間處的透射率,我們使用來表示透射率,於是得到公式(2):
由此可見,圖像去霧過程就是根據求解的過程。要求解出,還需要根據求解出透射率和全局大氣光。
實際上,所有基於霧天退化模型的去霧算法就是是根據已知的有霧圖像求解出透射率和全局大氣光。
3.1 如何估計全局大氣光值A?
將圖像的亮度最大的點的灰度值作為全局大氣光值。
利用暗通道估計全局大氣光值。在暗通道去霧算法中,從暗原色通道中選取最亮的比例的像素值,然后選取原輸入圖像中這些像素具有的最大灰度值作為全局大氣光值。三通道中每一個通道都有一個大氣光值。
分塊遞歸思想估計全局大氣光值。具體思想就是先將圖像平均分為四個部分,然后分別求取四個部分中的平均亮度值,選取亮度值最大的塊,將這個塊平均分為四個塊,選取最亮的塊,當分解到塊的大小達到一定閾值時,在這個塊中選取亮度最大的點作為全局大氣光A。可以看到這有一個遞歸的過程。
分段思量估計全局大氣光值。我記得這是一個韓國小哥提出的方法,對天空具有天然的免疫性。我們觀察一般的圖像,天空部分一般被分配在圖像的上部分,因此將圖像水平分為個部分,然后在最上的部分使用暗通道估計算法估計全局大氣光。
快速估計全局大氣光值。首先求取輸入圖像RGB三通道中的最小值,即求取暗原色通道圖像,然后對暗原色通道圖像進行均值濾波,然后求取其中灰度值最大的點,接着求取輸入圖像RGB三通道中值最大的通道圖像,然后求取出灰度值最大的點,然后將兩個點的灰度值的平均值作為全局大氣光A。
3.2 如何估計透射率?
3.2.1 暗通道去霧算法估計透射率
在3.1節估計出全局大氣光值之后,
根據公式(2)可以得出:
首先可以確定的是的范圍是,的范圍是,的范圍是。和是已知的,可以根據的范圍從而確定的范圍。已知的條件有:
根據(4)和(5)推出:
因此初略估計透射率的計算公式:
最后為了保證圖片的自然性,增加一個參數來調整透射率 :
3.2.2 利用迭代思想估計透射率
這個算法非常有意義,本人還沒來得及復現,先來看看原理。首先,如果想獲得更好的去霧效果,就要求去霧后的圖像對比度高,並且失真度小。然后對上面的公式(2)做一個變換可以得到:
可以發現,和在坐標軸上對應一條直線,其中直線和軸的交點是
,
。可以看到隨着在的范圍內進行變化,會對應的產生負數或者超過,這就導致了圖像失真。因此為了改善這一缺點,論文提出使用下面的等式來衡量失真度。
使用均方誤差MSE來衡量對比度增強。
其中,
表示平均值,
表示像素點總數,因此我們要求取透射率使得
最小。假設從t(x)開始,增強是,一直到結束,一共迭代次,選取其中使得上式最小的值作為該像素點的透射率。
可以想一下,這種做法會導致什么問題?復雜度會增加倍! 為了改善這一問題,我們可以假設一小塊區域的像素的透射率相同,計算每一小塊中
的最小值為該塊所有像素點的透射率。
3.2.3 精細化透射率的例子
如何精細化透射率,典型的有以下幾種方法:
Soft matting(暗通道去霧論文中有提到)。
雙邊濾波。
導向濾波。(已復現成功,后面分享)。
3.3 后處理
上面我們獲得了大氣光值以及透射率,那么根據霧天退化模型我們就可以獲得去霧后的結果圖了。一般來說,去霧后的結果圖可能會偏暗,因此可以適當進行一些后處理如采用自動對比度增強,亮度增強,伽馬校正 等圖像處理方法進行處理,以便得效果更佳的無霧圖像。
OK,現在了解了去霧算法的重要理論接下來就直接開始盤點經典算法。
4. 帶色彩恢復的多尺度視網膜增強算法(MSRCR)
這篇論文主要提出了一個Retinex理論,包含了兩個方面的內容:物體的顏色是由物體對長波、 中波和短波光線的反射能力決定的,而不是由反射光強度的絕對值決定的;物體的色彩不受光照 非均勻性的影響,具有一致性 。根據Retinex理論,人眼感知物體的亮度取決於環境的照明和物體表面對照射光的反射,其數學表達式為:
其中,I(x,y)代表被觀察或照相機接收到的圖像信號;L(x,y)代表環境光的照射分量 ;R(x,y)表示攜帶圖像細節信息的目標物體的反射分量 。
將上式兩邊取對數,則可拋開入射光的性質得到物體的本來面貌,即有關系式:
這個技術運用到圖像處理上,就是針對我們現在已經獲得的一幅圖像數據I(x,y),計算出對應的R(x,y),則R(x,y)認為是增強后的圖像,現在的關鍵是如何得到L(x,y)。Retinex理論的提出者指出這個L(x,y)可以通過對圖像數據I(x,y)進行高斯模糊得到。
因此,算法流程可以總結為:
輸入: 原始圖像數據I(x,y),尺度(也就是所謂的模糊的半徑)
計算原始圖像按指定尺度進行模糊后的圖像L(x,y)。
按照4-2式的計算方法計算出log[R(x,y)]的值。
將log[R(x,y)]量化為到范圍的像素值,作為最終的輸出。
具體效果怎么樣呢?看張圖吧。
原圖
結果圖
5. CVPR 2009 暗通道去霧算法
原理見:OpenCV圖像處理專欄六 | 來自何凱明博士的暗通道去霧算法(CVPR 2009最佳論文)
6. 基於中值濾波進行去霧
算法原理:OpenCV圖像處理專欄十 | 利用中值濾波進行去霧
7. A Fast Single Image Haze Removal Algorithm Using Color Attenuation Prior
這篇論文就更有意思了哦。論文觀察到,單幅圖像去霧的難點在於圖像中包含的關於場景結構等信息非常少,因此很難獲得較為全面的信息從而進行去霧。然而,人的大腦在面對一幅圖像的時候其實是可以很快的分辨清楚哪里有霧、哪里沒有,或者很快分辨清楚近景、遠景而不需要其他太多的資料。基於這一思考,作者對很多副有霧圖像進行分析發現統計意義上的結論從而提出一個新的思路,通過對很多圖像的遠景、中景、近景進行分析發現了霧的濃度與亮度和飽和度之差呈正比。
作者通過2幅圖像分析了有霧和無霧圖像的區別:
霧天退化模型可以寫成:
從Figure3中可以看到直接的衰減會導致反射能量的減弱,從而導致brightness的低值,也即。同時,大氣光成分會增強brightness的值並且降低飽和度saturation。 總結下來,即為,當霧的程度越大,大氣光成分的的影響越大。因此,論文考慮通過研究saturation和brightness之間的差來分析霧的濃度。公式為:
d(x)∝c(x)∝v(x)-s(x)
其中d(x)為景深,c(x)為霧濃度v(x), s(x)分別為亮度值和飽和度值。這個公式就是color attenuation prior。然后,作者通過構建訓練樣本采集了超過500張圖像,最后得出了合適的參數。最終公式如下:
最終,參數結果為:
8. 中部小結
上面列出了一些經典的用傳統算法去霧的例子(姑且把它叫作圖像去霧的前世),接下來我們看看CNN是如何在這個領域發揮的(圖像去霧的今生)。
9. 2016 華南理工DehazeNet
論文和代碼下載官方地址:http://caibolun.github.io/DehazeNet/
這篇論文是較早使用深度學習來進行去霧的網絡,它是一個端到端的模型,利用CNN來對大氣退化模型中的進行估計。模型輸入霧圖,輸出透射率映射圖,然后通過大氣退化模型來恢復無霧圖像。采用深度CNN結構(4層),並提出了一種新的非線性激活函數。提高了恢復圖像的質量。
DehazeNet的貢獻如下:
end2end系統,直接學習並估計傳輸率與有霧圖像的關系。
提出nonlinear激活函數,稱為BReLU(雙邊ReLU),取得了更好的恢復效果。
分析了DehazeNet與已有去霧技術之間的關系。
具體來說,作者先對暗通道去霧,最大對比度去霧(Maximum Contrast,MC,論文名為:Visibility in bad weather from a single image),基於顏色衰減先驗去霧(Color Attenuation Prior,CAP,論文名為:A fast single image haze removal algorithm using color attenuation prior),基於色度不一致去霧(A fast single image haze removal algorithm using color attenuation prior)這些方法做了介紹,然后作者結合上面的方法進行網絡設計,網絡結構主要分成4大部分:
特征提取。
多尺度映射。
局部極值。
非線性回歸。
網絡結構如下圖所示。
DehazeNet結構
9.1 特征提取
這里的特征提取和普通的CNN不同,這里采用“卷積+Maxout”的結構作為網絡第一層。如下面公式所示:
特征提取
其中表示輸出的特征,代表第個,是是指第一層,是指個層進行操作。和是權重和偏置。第一層是特征提取層,即提取有霧圖像特征。本文中使用了個濾波器,通過的激活函數,每四個輸出一張圖。這里不,輸入是三通道的塊。輸出的是四個,每一個代表一種特征。
作者指出,“卷積+Maxout”等價於傳統的手工去霧特征。當W1是反向(Opposite)濾波器,通道的最大等價於通道的最小值,等價於暗通道先驗(DCP);當W1是環形(Round)濾波器, 等價於對比度提取,等價於最大對比度(MC);當W1同時包含反向(Opposite)濾波器和全通(All-pass)濾波器,等價於RGB到HSV顏色空間轉換,等價於顏色衰減先驗(CAP)。此外,從機器學習角度,Maxout是一種樣條函數,具有更強的非線性擬合能力,如圖(d)。
9.2 多尺度映射
使用空間多個尺度的卷積。分別使用個的卷積核和特征圖進行卷積,最后一共獲得個大小的特征圖。
多尺度卷積細節
9.3 局部極值
根據假設,透射率具有局部不變性,所以使用了一個Max Pooling層(7*7大小)抑制透射率的估計噪聲。
9.4 非線性回歸
大氣透射率是一個概率(0到1),不可能無窮大,也不可能無窮小。受到Sigmoid和ReLU激勵函數的啟發,提出了新的激活函數(Bilateral Rectified Linear Unit,BReLU),在雙邊約束的同時,保證局部的線性。激活函數圖如下:
BReLU
9.5 訓練
要獲取自然場景的有霧和無霧的圖像是十分困難的,所以作者使用了基於物理霧霾形成模型的綜合訓練集。從網絡上收集的圖像中隨機抽樣個大小為的無霧霾。對於每個,作者統一采樣個以生成個模糊,這里為了減小變量學習的不確定性,將大氣光設置為,共生成個的數據。損失函數被定義為:
Loss
10. ICCV 2017 AOD-Net
論文名為:All-in-One Network for Dehazing and Beyond
這篇文章文並沒有單獨估計和大氣光,而是通過輕量級的CNN直接生成清晰的圖像,這種端到端的設計使得其可以嵌入到其他的模型中,比如說物體檢測Faster-RCNN。
這篇文章的貢獻如下:
提出了一個end2end的去霧模型,完成了有霧圖像到清晰圖像之間的轉化。通過將與統一,基於可以完成對清晰圖像的重構。
提出了新的比較去霧效果的客觀標准,定量研究去霧質量是如何影響后續高級視覺任務的,同時,其模型可以和其他深度學習模型無縫嵌套。
由霧天退化模型知可以知道,表達式中有兩個未知數大氣光和透射率,作者提出將這兩個未知數化為一個,即用將與相統一。其中,是具有默認值的恆定偏差。
核心理論
網絡結構如下:
All-in-One Network for Dehazing and Beyond 網絡結構
其中,K-estimation Module是利用輸入圖像對未知變量進行估計。而Clean image generation module 是將估計所得的作為自適應變量輸入網絡,得到。K-estimation Module 有點意思,作者是受到DehazeNet,MSCNN的啟發,使用五個卷積層,並通過融合不同大小的濾波器形成多尺度特征。值得注意的是,AOD-Net的每個卷積層僅僅使用了個卷積核。
11. CVPR 2018 DCPDN
論文標題:Densely Connected Pyramid Dehazing Network
論文的貢獻如下:
提出一個基於去霧公式的端到端的網絡。
一個保邊的密集連接的編解碼網絡生成。
為了獲得去霧后的圖和t之間的關聯性,使用判別器對它們進行聯合訓練。
DCPDN 網絡結構
具體而言,對於產生圖的網絡,采用的是多層金字塔池化模塊。這里從DenseNet里直接取前三個DenseBlock和相應的下采樣層作為Encode模塊,然后同樣使用DenseBlock進行上采樣。這樣做的目的是可以通過金字塔池化獲得全局的信息,Dense模塊可以讓利於信息流動,加速收斂。同時為了,為了最后的輸出獲得多個scale的特征,同時保留這些特征的局部信息而不是只獲得全局信息,這里使用了一個多scale的pooling層,將不同級別的特征pooling到同一個尺度下,然后進行上采樣。網絡示意圖如下所示:
多層密集連接金字塔池化模塊
而對於,使用一個8個Block的UNet。
12. WACV 2019 GCANet
論文標題:Gated Context Aggregation Network for Image Dehazing and Deraining 這篇論文用GAN網絡,實現可端到端的圖像去霧,本文的重點在於解決了網格偽影(grid artifacts)的問題,該文章的方法在PSNR和SSIM的指標上,有了極大的提升,非常值得借鑒。
本文貢獻如下:
提出端到端的去霧網絡,不依賴於先驗。
采用了smooth dilated convolution 代替原有的dilated convolution,解決了原來的dilated convolution導致的grid artifacts問題。
提出了一個gated fusion sub-network,融合high-level 及low-level 特征,提升復原效果。
網絡結構如Figure1所示,三個卷積模塊作為編碼部分,一個反卷積和兩個卷積作為解碼部分在二者之間插入多個smoothed dilated resblocks。
GCANet結構
12.1 Smoothed Dilated Convolution(平滑空洞卷積)
空洞卷積有一個缺點,它會產生網格偽影,針對這一問題,用了一個簡單的分離卷積。
Smoothed Dilated Convolution
在上圖中,上面這部分表示的是原始的空洞卷積,從圖中色塊可以看出,經過空洞率大於的空洞卷積后,輸出的特征圖中相鄰的特征值與輸入特征圖是完全獨立的,不存在相互依賴的關系,而我們知道圖像是局部相關的。因此,特征層也應當保留此特性。所以下面部分的圖就是Smoothed Dilated Convolution了,在執行空洞卷積之前,做了一次核為的分離卷積,卷積的參數共享,經過該層卷積之后,每一個特征點都融合了周圍大小的特征。該操作僅僅增加了大小的參數,卻能有效的解決網格偽影問題。
12.2 Gated Fusion Sub-network(門控融合子網)
這個子網絡主要是融合了不同層次的特征信息,和ASFF太像了。。。之前的網絡都是直接添加直連(shortcut)操作進行信息融合,這里的門控融合單元為不同層次的特征分別學習了權重,最后加權得到融合的特征層。
門控融合子網融合方式
12.3 損失函數
損失函數
13. AAAI 2018 Disentangled Dehazing Network
論文標題:Towards Perceptual Image Dehazing by Physics-based Disentanglement and Adversarial Training
作者認為之前基於先驗知識的去霧,缺點在於先驗知識不是在任何情況都滿足的(比如說多光源,大霧),並且不是監督訓練的。而基於CNN的去霧需要訓練集是成對的,即同時有有霧圖像與無霧圖像。而一個有效的去霧模型應該能夠學習無霧圖像到有霧圖像的映射,無需使用成對監督。並且人類對去霧后的圖像和沒去霧的圖像的感知應當是一致的,基於此,作者提出這個Disentangled Dehazing Network,主要貢獻如下:
提出一種基於解耦的新型去霧網絡。
收集了具有挑戰性的數據集,包含800多個自然模糊圖像與1000個無霧的室外場景圖像。
通過對合成和真實圖像的數據集的廣泛實驗來評估感知圖像去霧。
一句話總結,將GAN用於去霧。
13.1 解耦網絡 Disentangled Dehazing Network
論文引入基於解耦與重建的物理模型,目標是將有霧圖像解耦為隱藏特征值,再利用隱藏特征值重建圖像。網絡的總體結構如Figure1所示。
13.2 損失函數
損失函數包含三部分,重建損失,對抗損失,正則化損失。
重建損失。使用L1損失函數。
重建損失
多尺度對抗損失。為了生成更真實的圖像,作者其對中間輸出引入了多尺度生成訓練,受到(Isola et al. 2017) and (Zhu et al. 2017)啟發,作者使用了patch-level discriminator,並進行了改進,使用了局部鑒別器和全局鑒別器。如Figure2所示。
13.3 圖像恢復
經過網絡處理后,可以得到兩個去霧后的圖像,一個是生成器的直接輸出,另一個是利用估計的和來獲得的。這兩種方法得到的去霧圖像各有優劣,其中生成器輸出得到的圖像傾向於生成具有更多紋理細節的圖像,並且在感知上更加清晰,但是其易於受到噪聲的影響並且會有undesirable artifacts,而用后種方式得到的圖像更平滑,所以作者將二者進行了混合。公式如下:
混合兩個無霧圖像
14. CVPR 2018 Cycle-Dehaze
論文題目:Enhanced CycleGAN for Single Image
這篇論文是基於《Unpaired Image-to-Image Translation using Cycle-Consistent Adversarial Networks》來做改進的,前者設計了一個循環的對抗網絡學習圖像風格的遷移,使用不成對的圖像來訓練網絡。這篇論文在其基礎上加入了循環感知一致損失,對圖片的特征進行監督。其實可以總結為一句話,改造CycleGAN用於去霧。
沒興趣去看這篇論文了,就不細講了,感興趣可以去讀一讀。
15. 總結
盤點所認識的圖片去霧,可以看到這並不是一件簡單的事。