在計算機視覺領域,霧天等惡劣天氣會導致圖像對比度下降、細節模糊,嚴重影響後續的目標檢測、圖像分割等任務。圖像去霧算法作為解決這一問題的核心技術,已廣泛應用於自動駕駛、監控安防、遙感航拍等場景。本文將從基礎原理出發,系統梳理傳統去霧算法與深度學習去霧算法的核心思想、實現流程,並附上Python實操代碼,幫助大家快速掌握圖像去霧技術。
一、圖像去霧的核心原理:大氣散射模型
霧天圖像的退化本質是大氣散射導致的光線衰減,所有去霧算法的核心都是基於這一物理模型反向求解。
1. 大氣散射模型公式
霧天退化圖像的數學表達為:
:輸入的霧天圖像(觀測值)
:無霧原始圖像(待求解目標)
:透射率,反映光線到達相機的衰減程度(
,
:大氣光,霧天環境中的全局光照強度(通常為常數)
2. 去霧的核心目標
通過已知的 ,估算出
和
,再代入公式推導得到無霧圖像
:
其中
二、經典傳統去霧算法:原理與實現
傳統去霧算法的核心是通過先驗知識估算透射率 和大氣光
,無需大量數據訓練,實時性強。
1. 暗通道先驗算法(DCP):最經典的傳統方法
1.1 核心先驗假設
自然無霧圖像中,除了天空等亮區域,絕大多數局部區域(如 15×15 窗口)至少有一個通道(R/G/B)的像素值接近 0,這一區域稱為“暗通道”。
1.2 算法步驟
- 計算暗通道:對霧天圖像的每個像素,在局部窗口內取 R/G/B 三通道最小值,再對整個窗口取最小值,得到暗通道圖像
。
- 估算大氣光 A:在暗通道圖像中選取亮度最高的前 0.1% 像素,對應到原始霧天圖像中取這些像素的最大值作為
。
- 估算初始透射率:基於暗通道假設推導初始透射率
(
- 透射率優化:用軟matting或導向濾波對初始透射率進行平滑處理,避免去霧後圖像出現塊效應。
- 恢復無霧圖像:代入公式計算
。
1.3 Python 實現(OpenCV)
import cv2
import numpy as np
def dark_channel(img, window_size=15):
"""計算暗通道圖像"""
min_rgb = cv2.erode(cv2.min(img, axis=2), np.ones((window_size, window_size), np.uint8))
return min_rgb
def estimate_atmospheric_light(img, dark_img):
"""估算大氣光 A"""
h, w = img.shape[:2]
# 選取暗通道中前0.1%的亮像素
num_pixels = int(h * w * 0.001)
flat_img = img.reshape(-1, 3)
flat_dark = dark_img.flatten()
# 按暗通道亮度降序排序
indices = np.argsort(-flat_dark)[:num_pixels]
# 取這些像素在原始圖像中的最大值作為A
A = np.max(flat_img[indices], axis=0)
return A.astype(np.float64)
def estimate_transmission(img, A, omega=0.95, window_size=15):
"""估算初始透射率"""
normalized_img = img.astype(np.float64) / A
min_norm = cv2.erode(cv2.min(normalized_img, axis=2), np.ones((window_size, window_size), np.float64))
transmission = 1 - omega * min_norm
return transmission
def guided_filter(img, guide, radius=60, eps=1e-3):
"""導向濾波優化透射率"""
return cv2.ximgproc.guidedFilter(guide=guide, src=img, radius=radius, eps=eps)
def dehaze(img, window_size=15, omega=0.95, t0=0.1):
"""暗通道先驗去霧主函數"""
# 1. 計算暗通道
dark_img = dark_channel(img, window_size)
# 2. 估算大氣光A
A = estimate_atmospheric_light(img, dark_img)
# 3. 估算初始透射率
t_init = estimate_transmission(img, A, omega, window_size)
# 4. 導向濾波優化透射率
t_refined = guided_filter(t_init, img[:, :, 0], radius=60, eps=1e-3)
# 5. 限制最小透射率,避免失真
t_refined = np.maximum(t_refined, t0)
# 6. 恢復無霧圖像
img_float = img.astype(np.float64)
J = (img_float - A) / t_refined[..., np.newaxis] + A
# 像素值裁剪到[0,255]
J = np.clip(J, 0, 255).astype(np.uint8)
return J
# 測試代碼
if __name__ == "__main__":
# 讀取霧天圖像
foggy_img = cv2.imread("foggy_image.jpg")
# 去霧處理
dehazed_img = dehaze(foggy_img)
# 保存結果
cv2.imwrite("dehazed_image.jpg", dehazed_img)
# 顯示對比
cv2.imshow("Foggy Image", foggy_img)
cv2.imshow("Dehazed Image", dehazed_img)
cv2.waitKey(0)
cv2.destroyAllWindows()
2. 其他傳統去霧算法對比
|
算法名稱
|
核心思想
|
優點
|
缺點
|
|
直方圖均衡化(HE)
|
拉伸圖像灰度範圍,提升對比度
|
實現簡單、實時性強
|
易過度增強噪聲,色彩失真
|
|
Retinex 算法
|
分離圖像的照度和反射分量,修正照度
|
色彩還原好
|
對厚霧效果差,易出現光暈
|
|
基於偏振的去霧
|
利用偏振光分離散射光和目標光
|
物理模型精確
|
需專用偏振相機,場景受限
|
三、深度學習去霧算法:端到端的解決方案
傳統算法依賴人工設計的先驗,在厚霧、不均勻霧場景下效果有限。深度學習通過數據驅動自動學習去霧規律,實現端到端去霧,性能更優。
1. 深度學習去霧的核心思路
- 把去霧視為圖像復原任務:輸入霧天圖像
,輸出無霧圖像
,模型直接學習
- 無需手動估算透射率和大氣光,由網絡自動學習退化模型的逆過程。
2. 經典深度學習去霧模型
2.1 DehazeNet(2016):首個CNN去霧模型
- 核心結構:5層卷積網絡,通過“特徵提取→多尺度融合→透射率估計→圖像恢復”四步實現去霧。
- 創新點:首次用CNN替代人工先驗估算透射率,驗證了深度學習在去霧任務中的有效性。
2.2 AOD-Net(2017):輕量級端到端模型
- 核心結構:簡化網絡設計,僅用3層卷積,直接輸出無霧圖像。
- 創新點:提出“所有霧都可被表示為
”,簡化模型參數,實時性大幅提升(FPS達30+)。
2.3 基於Transformer的去霧模型(2020後)
- 核心優勢:CNN擅長提取局部特徵,而Transformer的自注意力機制能捕捉全局霧濃度分佈,解決不均勻霧去霧難題。
- 代表模型:DehazeFormer、Restormer(通用圖像復原模型,去霧效果頂尖)。
3. 深度學習去霧的關鍵要素
- 數據集:常用公開數據集有 RESIDE(最大去霧數據集,含合成霧和真實霧圖像)、HazeRD。
- 損失函數:採用 L1 損失(減少模糊)+ 感知損失(提升視覺質量)+ 對抗損失(GAN-based模型,增強細節)。
- 訓練技巧:使用數據增強(隨機裁剪、翻轉、霧濃度變化)提升模型泛化能力。
四、算法性能評估與對比
1. 客觀評價指標
- 峯值信噪比(PSNR):衡量去霧後圖像與真實無霧圖像的像素誤差,值越高越好(通常≥25dB為優秀)。
- 結構相似性(SSIM):衡量圖像的結構一致性,值越接近1越好。
- 運行速度(FPS):實時場景(如自動駕駛)需≥30FPS。
2. 不同算法性能對比
|
算法類型
|
PSNR(dB)
|
SSIM
|
FPS(CPU)
|
適用場景
|
|
暗通道先驗(DCP)
|
22-28
|
0.75-0.85
|
5-10
|
非實時、輕霧場景
|
|
AOD-Net
|
28-32
|
0.85-0.92
|
30+
|
實時場景、移動端部署
|
|
DehazeFormer
|
32-38
|
0.92-0.96
|
10-20
|
高精度場景、厚霧去霧
|
五、總結與未來展望
1. 核心總結
- 傳統去霧算法(如DCP)依賴物理先驗,實現簡單、實時性強,但對複雜霧場景適應性差。
- 深度學習去霧通過端到端學習,能處理厚霧、不均勻霧,視覺效果更優,但需大量數據訓練,部分模型計算量較大。
- 實際應用中需根據場景選擇:實時場景用AOD-Net,高精度場景用DehazeFormer,資源受限場景用DCP。
2. 未來趨勢
- 實時高精度去霧:結合輕量化網絡(如MobileNet、ShuffleNet)與Transformer,平衡速度和性能。
- 跨場景適配:解決真實霧與合成霧的域差異,提升模型在真實場景的泛化能力。
- 多任務融合:將去霧與目標檢測、語義分割等任務聯合訓練,滿足端到端視覺系統需求。